Template
-
Ich brauch ein Template, aber es geht nicht. Wo ist der Fehler?
//header file
class AClass
{
//...
template<class T>
static int StaticMethod(std::vector<T> Vector);
};//Impl
template <class T>
int AClass::StaticMethod(std::vector<T> Vector)
{
return 0;
}// main file
int main(int argc, char* argv[])
{std::vector<int> Vec;
Vec.push_back(5);
Vec.push_back(6);
Vec.push_back(7);AClass::StaticMethod<int>(Vec); // Bei dieser Zeile gibt's Probleme
// Wenn ich sie auskommentiere dann gehts.
return 0;
}
-
Wenn dein Compiler nicht das Schlüsselwort "export" kennt, muss du deine
Implementierung mit in die Header-Datei packen.mfg JJ
-
Das liegt daran, daß zum Zeitpunkt der Instanzzierung des templates die komplette Definition sichtbar sein muß. Wenn Du Deine Definition jetzt aber in eine Implementierungsdatei auslagerst, dann ist das in der main nicht sichtbar und kann deshalb nicht verwendet werden.
Es gibt mehrere Möglichkeiten das zu umgehen
-
export benutzen, das ist aber nicht wirklich eine Option, da mir nur ein Compiler bekannt ist, der das unterstützt. Außerdem kann man sich damit so manch anderes Problem an Land ziehen.
-
Definition einfach mit in den Header schreiben
-
Die Definition in ein .inl-File schreiben und das im Header includen.
mit etwas Makro-Magie kann man 3 auch recht einfach so gestalten, daß export genutzt wird, wenn vorhanden.
MfG Jester
-
-
John Doe schrieb:
Wenn dein Compiler nicht das Schlüsselwort "export" kennt, muss du deine
Implementierung mit in die Header-Datei packen.mfg JJ
Ich hab MS Studio 6.0 Compiler.
Export Schlüsselwort kennt er nicht.
Implementation hab ich in die Header Datei genommen. Der compiler sagt trotzdem "interal compiler error"
-
Oh, ich glaub der 6.0 kann keine member-templates.
Kommst Du nicht vielleicht mit ner Funktion aus?
Sonst mußte nen Workaround basteln und für jeden member-template nen klassen-template bauen, das diese Methode enthält.MfG Jester
-
Ich komme mit einer Funktion aus.
Zum Workaround: Hast du ein kleines Beispiel?
-
nicht wirklich. Mußt mal im Forum suchen, es gibt sicher ne Menge dazu. Hume hat da das ein oder andere gebastelt. Ich kenne mich da nicht so aus, mein Compiler kann das. :p
-
Hume, mach mal ein Beispiel.
-
http://www.c-plusplus.net/forum/viewtopic.php?t=69116&highlight=template+workaround
wäre zum Beispiel eins. Such einfach mal nach template workaround und Autor: HumeSikkins. Da findest Du noch mehr.
MfG Jester
-
Jester schrieb:
http://www.c-plusplus.net/forum/viewtopic.php?t=69116&highlight=template+workaround
wäre zum Beispiel eins. Such einfach mal nach template workaround und Autor: HumeSikkins. Da findest Du noch mehr.
MfG Jester
Danke vielmals.
-
Jester schrieb:
Oh, ich glaub der 6.0 kann keine member-templates.
Ganz so schlimm ist es nicht. Der VC 6.0 unterstützt Member-Templates, kommt aber nicht mit einer Definition außerhalb der Klassendefinition klar.
Sprich statt:
class AClass { //... template<class T> static int StaticMethod(std::vector<T> Vector); }; //Impl template <class T> int AClass::StaticMethod(std::vector<T> Vector) { return 0; }
muss man hier:
class AClass { //... template<class T> static int StaticMethod(std::vector<T> Vector) { return 0; } };
schreiben.
-
@HumeSikkens:
Auch wenn ich das so mache wie du vorschlägst sagt der Compiler:*****
fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1794)
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Error executing cl.exe.Temp1.exe - 1 error(s), 0 warning(s)
*****
-
Ändere mal
AClass::StaticMethod<int>(Vec);
in
AClass::StaticMethod(Vec);
Keine Ahnung, ob das was bringt. Einen Versuch ist es aber wert.
Ansonsten, meine Empfehlung
Compilerupdate.
-
Hab alles Vorgeschlagene auspropbiert und kriege immer noch den Compilererror.
-
Hallo,
kann es sein, dass du kein aktuelles Service Pack (SP 5.0 oder 6.0) für denen VC 6.0 installiert hast?
Ich kenne deinen Kontext nicht, aber ein einfaches Beispiel wie:class AClass { public: //... template<class T> static int StaticMethod(std::vector<T> Vector) { return 0; } }; int main() { AClass a; vector<int> v; AClass::StaticMethod(v); a.StaticMethod(v); }
übersetzt mein VC 6.0 SP 5 anstandslos.
-
@HummeSikkins
Ich hab tatsächlich nie ein SP installiert.
Ich installiere heute Abend SP6.
Danke für deine Hilfe
Bist ein richtiger Experte
)
Hast mehr Plan von meinem Rechner als ich selbst