Si consideri il seguente codice:Accesso variabile ereditata dalla classe genitore template
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 e 4.1.2 dare errore
test.cpp: In member function `int Bar<T>::Perna(int)':
test.cpp:25: error: `a' was not declared in this scope
g ++ 2.96 e MSVC 6, 7 , 7.1, 8 e 9 lo accettano, così come (almeno) i vecchi compilatori C++ Intel e SGI.
Il nuovo compilatore Gnu C++ rispetta lo standard o no? Se lo fanno, qual è la logica alla base di questa classe ereditaria non è in grado di vedere una variabile membro ereditata protetta?
Inoltre, se c'è
int A() { return a; }
a Foo, ottengo l'errore
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)
quando cerco di usarlo in una funzione membro di Bar. Trovo altrettanto curioso: Bar eredita Foo, quindi penso che sia ovvio che A() nell'ambito di Bar sia Foo :: A().
Grazie. Ho intenzione di rimboccarmi le maniche e cambiare il codice. –
Credo che sia necessario eseguire l'istruzione using a livello di classe, ad esempio il modello Bar: public Foo {using Foo :: a; ...}; –