Tại sao mã sau đây cho tôi lỗi (g ++ 4.1.2)?Chức năng thành viên được đánh dấu có giá trị trả về typedef
template<class A>
class Foo {
public:
typedef std::vector<A> AVec;
AVec* foo();
};
template<class A>
Foo<A>::AVec* Foo<A>::foo() { // error on this line
return NULL;
}
Lỗi này là:
error: expected constructor, destructor, or type conversion before '*' token
Làm sao tôi phải xác định Foo<A>::foo()
chức năng khác (với kiểu trả về đúng)?
Giải pháp của bạn là chính xác, nhưng tôi không chắc chắn về giải thích. Ngay sau khi trình biên dịch đạt đến 'Foo :: foo' nó sẽ quay trở lại và "sửa" loại trả về. Nếu nó không làm điều này, nó sẽ không khớp với khai báo 'foo' (trong lớp) với định nghĩa (nghĩa là nó sẽ cảnh báo rằng các kiểu trả về là khác nhau). Điều này không liên quan gì đến tra cứu 'hai giai đoạn' theo liên kết của bạn. –
Tôi tin rằng tôi đã nhầm lẫn trong liên kết tra cứu hai giai đoạn. Lời giải thích đúng là - khi tìm kiếm một tên phụ thuộc lồng nhau (một cái dựa trên một tham số mẫu không xác định, tức là Foo :: Bar), nó được giả định không phải là một loại. Ngoại lệ duy nhất là trong danh sách lớp cơ sở. Đối với trình biên dịch sửa chữa kiểu trả về - không, việc khởi tạo mẫu xảy ra sau này; lỗi được nhận trong quá trình quét đầu tiên được thực hiện bởi trình biên dịch trên mã – ASk