Xét đoạn mã sau:Truy cập biến kế thừa từ lớp cha templated
template<class T> class Foo
{
public:
Foo() { a = 1; }
protected:
int a;
};
template<class T> class Bar : public Foo<T>
{
public:
Bar() { b = 4; };
int Perna(int u);
protected:
int b;
};
template<class T> int Bar<T>::Perna(int u)
{
int c = Foo<T>::a * 4; // This works
return (a + b) * u; // This doesn't
}
g ++ 3.4.6, 4.3.2 và 4.1.2 cho lỗi
test.cpp: In member function `int Bar<T>::Perna(int)':
test.cpp:25: error: `a' was not declared in this scope
g ++ 2,96 và MSVC 6, 7 , 7.1, 8 và 9 chấp nhận nó, cũng như (ít nhất) các trình biên dịch Intel và SGI C++ cũ hơn.
Trình biên dịch Gnu C++ mới có tuân thủ tiêu chuẩn hay không? Nếu có, lý do cơ bản đằng sau lớp thừa kế đó không thể thấy biến thành viên được kế thừa được bảo vệ là gì?
Ngoài ra, nếu có
int A() { return a; }
trong Foo, tôi nhận được lỗi
test.cpp:25: error: there are no arguments to A that depend on a template parameter, so a declaration of A must be available
test.cpp:25: error: (if you use -fpermissiveâ, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
khi tôi cố gắng sử dụng nó trong một hàm thành viên của Bar. Tôi thấy rằng tò mò là tốt: Bar thừa hưởng Foo, vì vậy tôi nghĩ rằng đó là rõ ràng rằng A() trong phạm vi của Bar là Foo :: A().
Cảm ơn. Tôi sẽ cuộn tay áo và thay đổi mã. –
Tôi tin rằng bạn phải thực hiện tuyên bố sử dụng ở cấp lớp, ví dụ: mẫu Thanh: công khai Foo {using Foo :: a; ...}; –