2016-07-26 24 views
0

Nach dem Erstellen einer Templates-C++ - Klasse, die eine Ganzzahl in einer Headerdatei verwendet, habe ich festgestellt, dass Eclipse meine Methodenimplementierungen in der entsprechenden CPP-Datei nicht erkennt.Die Memberdeklaration wurde nicht gefunden, wenn die Klassenvorlage eine Ganzzahl annimmt

Hier ist ein Beispiel-Klasse, die eine Größe Template-Parameter nimmt:

template <int SIZE> 
class SizeableClass 
{ 
public: 
    SizeableClass(); 
    virtual ~SizeableClass(); 
}; 

ich Eclipse-sagte den Durchführungsstellen für mich zu generieren mit Source => Methode implementieren ...

Es einige Inline-Verfahren hergestellt in der Header-Datei. Ich habe sie in die .cpp-Datei verschoben, um Ordnung zu schaffen, und den Qualifizierer inline entfernt. Meine .cpp Datei sah jetzt so aus:

Aber das war rot mit dem "Member declaration not found" Fehler unterstrichen. Es wird nicht kompilieren mit gcc entweder:

SizeableClass.h:2:7: error: provided for ‘template<int SIZE> class SizeableClass’ 
class SizeableClass 
    ^

Was ist damit passiert?

+0

Für wen auch immer abgelehnt/gewählt zu schließen: Könnten Sie sich rechtfertigen, damit ich die Frage verbessern kann? – CJxD

+1

Dies ist ein Fehler in CDTs "Implement-Methode" -Operation. Ich habe https://bugs.eclipse.org/bugs/show_bug.cgi?id=510289 abgelegt, um sie zu verfolgen. – HighCommander4

Antwort

4

Der Eclipse-Generator scheint einen wichtigen Teil der Implementierungen verpasst zu haben. Dies hätte das gleiche Problem, selbst wenn sie nicht aus der Header-Datei entfernt wurden.

Üblicherweise werden Vorlagen mit typenames verwendet wie:

template<typename T> 
SizeableClass<T>::SizeableClass() 
{ 
} 

template<typename T> 
SizeableClass<T>::~SizeableClass() 
{ 
} 

es ist also verzeihlich zu denken, dass, wenn Sie nicht typenames es nicht brauchen, um etwas zwischen den eckigen Klammern (<>) verwendet wird. In diesem Fall muss der Template-Parameter SIZE in diese Klammern gesetzt werden. Die CPP-Datei sollte lauten:

template<int SIZE> 
SizeableClass<SIZE>::SizeableClass() 
{ 
} 

template<int SIZE> 
SizeableClass<SIZE>::~SizeableClass() 
{ 
} 

// Additionally, if there are any methods that return SizeableClass, they also need to be parametrized 
template<int SIZE> 
SizeableClass<SIZE> SizeableClass<Size>::myMethod() 
{ 
} 

Als Randbemerkung, wird dies nicht richtig kompilieren, wenn das Programm zu verknüpfen. Da es sich bei den Funktionen um Vorlagen und nicht um tatsächliche Implementierungen handelt, muss für jede Klasse, die die Headerdatei enthält, auch die Vorlagendefinition angezeigt werden. Dies kann behoben werden, indem die Funktionen inline erneut ausgeführt werden und entweder in die Header-Datei eingefügt werden oder sie eingeschlossen werden.