Possible Duplicate:
GCC problem : using a member of a base class that depends on a template argumentKonstanten in Template-Klassen definiert
Ich dachte, ich war vertraut mit C++, aber anscheinend nicht genug vertraut.
Das Problem ist, wenn Sie eine Konstante in einer Vorlagenklasse definieren, können Sie die Konstante in neuen Klassen verwenden, die von dieser Klasse abgeleitet sind, aber nicht Vorlage Klassen, die davon abgeleitet sind.
Zum Beispiel sagt gcc
test.h:18: error: ‘theconstant’ was not declared in this scope
wenn ich versuche, diese (vereinfacht) Header-Datei zu kompilieren:
#pragma once
template <typename T> class base
{
public:
static const int theconstant = 42;
};
class derive1 : public base<size_t>
{
public:
derive1(int arg = theconstant) {}
};
template<typename T> class derive2 : public base<T>
{
public:
derive2(int arg = theconstant) {} // this is line 18
};
Das Problem ist also, dass eine Klasse, derive1
, fein kompiliert, aber die andere Klasse, derive2
, die eine Template-Spezialisierung ist, nicht.
Nun vielleicht gcc's Fehler ist nicht klar genug, aber ich verstehe nicht, warum der Konstruktor in derive2
einen anderen Umfang als der in derive1
haben würde.
Falls es darauf ankommt, geschieht dies beim Kompilieren der Headerdatei selbst, nicht beim Instanziieren eines Objekts vom Typ derive2<type>
.
Ich weiß auch, was zu ändern, um dies zu kompilieren, so dass ich nicht wirklich nach einzeiligen Code als Antworten suchen. Ich möchte verstehen, warum dies passiert! Ich habe versucht, das Internet zu durchsuchen, aber anscheinend verwende ich nicht die richtigen Suchargumente.
FWIW, der gleiche Code kompiliert in VC++ 2010 gut. Dies könnte ein Fehler in GCC sein ... – dsharlet
'here2 (int arg = Basis :: theconstant) {}' kompiliert gut. –
jrok
@dsharlet - kein Fehler im GCC-Teil, wie in der Spezifikation beschrieben. – Flexo