template<typename T>
class Base
{
protected:
Base() {}
T& get() { return t; }
T t;
};
template<typename T>
class Derived : public Base<T>
{
public:
Base<T>::get; // Line A
Base<T>::t; // Line B
void foo() { t = 4; get(); }
};
int main() { return 0; }
Wenn ich Linien A und B auf Kommentar, dieser Code kompiliert unter Visual Studio 2008. Und doch gut, wenn ich unter GCC kompilieren 4.1 mit Linien A und B kommentiert, erhalte ich diese Fehler:Warum benötigt GCC zusätzliche Deklarationen in Vorlagen, wenn VS dies nicht tut?
In member function ‘void Derived::foo()’:
error: ‘t’ was not declared in this scope
error: there are no arguments to ‘get’ that depend on a template parameter, so a declaration of ‘get’ must be available
Warum würde ein Compiler die Zeilen A und B benötigen, während der andere nicht? Gibt es eine Möglichkeit, dies zu vereinfachen? Mit anderen Worten, wenn abgeleitete Klassen 20 Dinge aus der Basisklasse verwenden, muss ich für jede Klasse, die von Base stammt, 20 Deklarationszeilen setzen. Gibt es dafür einen Weg, der nicht so viele Deklarationen erfordert?
Ein obligatorischer Link zu C++ FAQ: http://www.parashift.com/c++-faq- lite/templates.html # faq-35.19 – UncleBens
Kurze Antwort: weil gcc standardkonform ist und (überraschend) Visual C++ nicht ist? –