2010-04-29 48 views
6

Tôi đang cố gắng sử dụng các biến thành viên của một lớp cơ sở templated trong một lớp học có nguồn gốc, như trong ví dụ này:biến thành viên Sử dụng kế thừa từ một lớp cơ sở templated (C++)

template <class dtype> 
struct A { 
    int x; 
}; 

template <class dtype> 
struct B : public A<dtype> { 
    void test() { 
     int id1 = this->x;  // always works 
     int id2 = A<dtype>::x; // always works 
     int id3 = B::x;   // always works 
     int id4 = x;   // fails in gcc & clang, works in icc and xlc 
    } 
}; 

gcc và kêu vang đều rất cầu kỳ về việc sử dụng biến này và yêu cầu một phạm vi rõ ràng hoặc sử dụng rõ ràng "điều này". Với một số trình biên dịch khác (xlc và icc), mọi thứ hoạt động như tôi mong đợi. Đây có phải là trường hợp xlc và icc cho phép mã không phải là tiêu chuẩn hay một lỗi trong gcc và clang không?

+1

Câu hỏi tương tự: http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument –

Trả lời

5

Có thể bạn đang biên dịch ở chế độ không nghiêm ngặt trong icc. Dù sao, vì x không đủ tiêu chuẩn, nó sẽ không được tra cứu trong bất kỳ lớp cơ sở nào phụ thuộc vào các tham số mẫu. Vì vậy, trong mã của bạn, không có nơi nào tìm thấy x và mã của bạn không hợp lệ.

Các tên khác được tra cứu bằng cách sử dụng một dạng tra cứu khác (tra cứu truy cập thành viên lớp học và tra cứu đủ điều kiện). Cả hai dạng này sẽ xem xét các lớp cơ sở phụ thuộc nếu chúng có thể (tức là nếu chúng phụ thuộc, và do đó nhìn lên khi tạo mẫu khi xuất hiện dtype - tất cả các tên khác của bạn phụ thuộc vào tham số mẫu).

Ngay cả GCC trong các phiên bản mới nhất của chúng không thực hiện đúng và một số tên phụ thuộc still resolve against dependent bases trong quá trình tra cứu không đủ tiêu chuẩn.

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