2012-01-13 47 views
8

Tôi là người mới sử dụng C++. Hôm nay, tôi có một vấn đề: trong tập tin tiêu đề, tôi xác định một lớp:Lỗi C++: Không khai báo thành viên

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

và trong tập tin nguồn, tôi chương trình như:

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

khi biên soạn, biên dịch luôn luôn nói: 'Thành viên tuyên bố không tìm thấy '. tại sao?

tôi sử dụng nhật thực CDT + Cygwin GCC

thank you very much!

+1

AFAIK bạn không nên triển khai lớp mẫu trong tệp nguồn. Đặt định nghĩa của hàm trong tiêu đề. – Lucian

Trả lời

6

Lớp mẫu phải được khai báo và xác định trong tiêu đề hoặc một tệp khác được người dùng đưa vào. Chúng không thể được khai báo trong một tiêu đề và được định nghĩa trong một tệp nguồn như bình thường. Lý do là mẫu phải được thay thế bằng loại thực và nguồn được tạo và biên dịch khi được sử dụng và trình biên dịch chắc chắn không thể biên dịch trước các mẫu cho mọi loại có thể có, vì vậy người dùng cần có thể xử lý (và vì vậy, cần truy cập vào mã).

Điều này gây ra một số vấn đề khi chuyển đối tượng, nếu nhiều thư viện có cùng mẫu, vì chúng có thể được biên dịch dựa trên các phiên bản khác nhau của tiêu đề (xem Quy tắc một định nghĩa).

0

Bạn nên bao gồm tệp nguồn của bạn ở phần cuối của tập tin header hoặc bạn xác định chức năng thành viên trong tập tin tiêu đề khi bạn định nghĩa một lớp mẫu

1

"tuyên bố thành viên không tìm thấy" là một lỗi sản xuất bởi các phân tích tĩnh Eclipse công cụ (codan) thay vì trình biên dịch. Nếu bạn gặp lỗi này, nhưng việc biên dịch thành công thì đây là một sai số dương. Các phiên bản cũ hơn của công cụ này được biết là cung cấp một số mặt tích cực sai, xem ví dụ this bug report. Vì vậy, tôi khuyên bạn nên cập nhật Eclipse CDT lên phiên bản mới nhất. Nếu điều này không hiệu quả, hãy gửi báo cáo lỗi tới CDT Eclipse.

Tuy nhiên, nếu bạn gặp lỗi từ trình biên dịch (chúng được biểu thị bằng vấn đề C/C++ trong cột Loại trong dạng xem vấn đề) thì có thể bạn đã quên bao gồm tệp tiêu đề.

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