2010-04-05 26 views
36

Có mã:không được phép ctor kiểu trả

struct B 
{ 
    int* a; 
    B(int value):a(new int(value)) 
    { } 
    B():a(nullptr){} 
    B(const B&); 
} 

B::B(const B& pattern) 
{ 

} 

Tôi nhận được err msg:
'Lỗi 1 lỗi C2533: 'B :: {ctor}': nhà xây dựng không phép một kiểu trả về'

Bất kỳ ý tưởng nào tại sao?
P.S. Tôi đang sử dụng VS 2010RC

+23

ah, dấu chấm phẩy sợ hãi ở cuối cấu trúc/lớp. – falstro

Trả lời

65

Bạn đang thiếu dấu chấm phẩy sau định nghĩa struct của mình.


Lỗi chính xác, hàm tạo không có kiểu trả về. Bởi vì bạn đang thiếu một dấu chấm phẩy, mà toàn bộ định nghĩa struct được xem như một kiểu trả về cho một chức năng, như trong:

// vvv return type vvv 
struct { /* stuff */ } foo(void) 
{ 
} 

Thêm dấu chấm phẩy của bạn:

struct B 
{ 
    int* a; 
    B(int value):a(new int(value)) 
    { } 
    B():a(nullptr){} 
    B(const B&); 
}; // end class definition 

// ah, no return type 
B::B(const B& pattern) 
{ 

} 
+0

Cảm ơn. BTW không ai biết trong c + + 0x sẽ không cần cho rằng dấu chấm phẩy ngớ ngẩn? Khi bạn nghĩ về điều này, nó có phần không tương thích với các cấu trúc khác trong C++. Hay tôi đang thiếu một cái gì đó? –

+0

Đó là một loại c nôn nao, việc khai báo một cấu trúc là định nghĩa của một kiểu, và việc khai báo một lớp trông giống như một cấu trúc. ps VS2010 cảnh báo bạn về điều này! –

+10

@ Martin: nó không chỉ là một "nôn nao" từ C. Một cái gì đó như: 'class {/ * ... * /} đối tượng;' được cho phép, vì vậy dấu chấm phẩy là * cần thiết * để nói với trình biên dịch nó đạt đến cuối định nghĩa lớp. –

12

Bạn cần một trình biên dịch tốt hơn. Với g ++:

a.cpp:1: error: new types may not be defined in a return type 
a.cpp:1: note: (perhaps a semicolon is missing after the definition of 'B') 
a.cpp:5: error: return type specification for constructor invalid 

Các dấu chấm phẩy là cần thiết vì nó chấm dứt một danh sách có thể xảy ra trường hợp của struct:

struct B { 
... 
} x, y, z; 

Tạo ba trường hợp của B gọi là x, y và z. Đây là một phần của di sản C của C++, và sẽ vẫn ở đó trong C++ 0x.

+0

+1 cho câu trả lời, -1 cho lý do. Nó là tương đối dễ dàng để thực hiện (cho thuận) rằng nếu không có gì sau khi khung thats sự kết thúc của các tuyên bố. –

+2

@atch Bạn là chuyên gia về phân tích cú pháp C++ ngay bây giờ? Vấn đề là có * là * cái gì đó sau struct - constructor của bạn. –

+1

@atch: Bạn đã bao giờ viết trình biên dịch chưa? – GManNickG

Các vấn đề liên quan