2010-10-03 42 views
5

Theo C++0x spec, sau đây là hợp phápC++ 0x Peer Constructor trong VC2010

class A { 
    A(int i) : x(i) {} 
    A() : A(0) {} 
    int x; 
}; 

Nhưng nó không thành công để biên dịch ("A" is not a nonstatic data member or base class of class "A") trong VC năm 2010. Bất cứ ai biết chuyện gì vậy?

+0

Có lẽ bạn chưa chỉ định C++ 0x trong cài đặt trình biên dịch của mình. – JoshD

+4

Đó không phải là thông số C++ 0x. Thông số C++ 0x vẫn còn trong bản nháp và đang chờ phê duyệt và trông giống như wikipedia. Đây là "Bản thảo cuối cùng của Ủy ban": http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf –

Trả lời

8

Visual C++ 2010 (còn được gọi là VC++ 10.0) vì văn bản này không hỗ trợ các nhà thầu ủy nhiệm, đó là những gì đoạn mã của bạn yêu cầu. VC++ 10.0 chỉ hỗ trợ một phần cho C++ 0x, và khi viết bài này, không có trình biên dịch nào đã triển khai toàn bộ tính năng C++ 0x (mặc dù điều đó sẽ sớm thay đổi, đặc biệt khi tiêu chuẩn C++ 0x được hoàn thành).

Scott Meyers có a summary of C++0x support in gcc and MSVC compilers. Đây là một danh sách khác của C++0x feature support in different compilers. Ngoài ra, a list of C++0x features supported in Visual C++ 2010 straight from the horse's mouth.

Còn bây giờ, khởi tạo tất cả các thành viên trực tiếp trong danh sách khởi tạo của nhà thầu của bạn:

class A 
{ 
public: 
    A(int i) : x(i) {} 
    A() : x(0) {} 
private: 
    int x; 
}; 
+0

Đáng ngạc nhiên, A() {A (0); } hoạt động vì một lý do nào đó. – jameszhao00

+6

@ jameszhao00: Nó "hoạt động" bởi vì đó không phải là một nhà xây dựng ủy nhiệm. Bạn đang tạo một tạm thời chưa được đặt tên 'A' sẽ bị hủy sau khi hàm khởi tạo kết thúc, đó không phải là thứ bạn muốn. –

+0

Điểm tốt! Cảm ơn vì bạn đã làm sáng tỏ. Quá quen với Java/C# Tôi đoán: ( – jameszhao00

0

MSVC++ 2010 không có hỗ trợ cho delegating constructor

This page danh sách C + 0x tính năng và hỗ trợ họ trong các trình biên dịch phổ biến.