Rozważmy następujący kod:Dostęp do zmiennej odziedziczoną matrycy klasy nadrzędnej
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 i 4.1.2 dają error
test.cpp: In member function `int Bar<T>::Perna(int)':
test.cpp:25: error: `a' was not declared in this scope
g ++ 2.96 i MSVC 6, 7 , 7.1, 8 i 9 akceptują to, podobnie jak (przynajmniej) starsze kompilatory Intel i SGI C++.
Czy nowy kompilator Gnu C++ jest zgodny ze standardem, czy nie? Jeśli tak, jakie są powody, dla których ta dziedzicząca klasa nie jest w stanie zobaczyć chronionej odziedziczonej zmiennej członkowskiej?
Ponadto, jeśli istnieje
int A() { return a; }
w Foo, ja się błąd
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)
gdy próbuję go użyć w funkcji składowej barskiej. Ciekawe jest również: Bar dziedziczy Foo, więc myślę, że jest oczywiste, że A() w zakresie Bar to Foo :: A().
Dzięki. Zamierzam przetoczyć rękawy i zmienić kod. –
Wierzę, że musisz zrobić instrukcję użycia na poziomie klasy, to jest szablon Bar: publiczny Foo {używając Foo :: a; ...}; –