Immernoch Default-Argumente bei Templates



  • Hi!

    Ich hab immernoch Probleme mit meinen ersten Templates 😞 Langsam glaube ich,
    dass die Template-Implementationen vom VS C++.Net 2002 noch nicht ganz so
    ausgereift sind... Oder ich bin mal wieder zu blöd 🙄

    Also hier das Problem. Ich hab zwei Klasse-Template-Methoden, von denen die
    eine die Spezialisierung der Anderen ist:

    template <class T>
    T GetAttributeValue(string attribute, string tag, string parent, T stdValue=T())
    {
    [...]
    }
    
    template <>
    string GetAttributeValue<string>(string attribute, string tag, string parent, string stdValue)
    {
    [...]
    }
    {
    

    Auf dem ersten Blick war alles i.O. Wenn ich jetzt aber die spezialisierte
    Methode aufrufe, ohne den den letzten Parameter anzugeben:

    levelParser.GetAttributeValue<string>("value", "File", "parent");
    

    Gibts den Fehler:

    error C2065: 'T' : nichtdeklarierter Bezeichner
    

    Der Fehler kommt nicht, wenn ich das letzte Argument angebe, oder einen anderen
    Typ nehme, der nicht spezialisiert ist (z.B. double).

    Das klingt für mich irgendwie verdammt unlogisch...

    MfG,

    EnERgYzEr



  • Kannst du mal ein Minimalbespiel posten?
    Wenn ich die beiden als freie Templatefunktion deklariere, funktioniert das Ganze bei mir (gcc 3.3.4), nur mit der Syntax in einer Klasse komme ich nicht so recht hin!

    EDIT: War zu voreilig, klappt doch bei mir:

    #include <iostream>
    #include <string>
    using namespace std;
    class test
    {
    public:
    	template <typename T> 
    	T GetAttributeValue(string attribute, string tag, string parent, T stdValue=T()) 
    	{ 
    		return stdValue;
    	} 
    
    };
    template <> 
    string test::GetAttributeValue<string>(string attribute, string tag, string parent, string stdValue) 
    { 
    	return stdValue;
    } 
    
    int main()
    {
    	test temp;
    	cout << temp.GetAttributeValue<string>("","","") << endl;
    }
    

    Wie gesagt kompiliert mit gcc 3.3.4!



  • Das hört sich ja nicht gut an 😞

    Wieso hast du die Definition der spezialisierten Methode außerhalb von der
    Klasse hingeschrieben?

    Aber schon mal vielen Dank für deine Mühen!



  • Hab das ganze noch mal getestet:

    In deiner Form kann ich das überhaupt nicht kompilieren

    error C2511: 'std::string test::GetAttributeValue(std::string,std::string,std::string,std::string)' : Überladene Memberfunktion nicht in 'test' gefunden
    

    Und, wenn ich die Spezialisierte Form wieder mit rein nehme, habe ich auch
    in diesem Primitiv-Beispiel wieder den alten Fehler: Also Compiler-Bug!

    Scheiße! Warum immer dann, wenn man es überhaupt nicht gebrauchen kann! 😡

    Gibt es einen (kostenlosen) Compiler, den man leicht in das VS integrieren
    kann und der auch problemlos DirectX Anwendungen, etc. kompilieren wird, ohne
    dass ich alles neuschreiben darf?

    Oder hat doch noch irgendwer eine Lösung?



  • kann es sein das der compiler, da du in der spezialiserten form keine def-argumente hast, auf die nicht spezialisierte form zurückgreift ?
    bei

    template <>
    string GetAttributeValue<string>(string attribute, string tag, string parent, string stdValue)
    {
    [...]
    }
    

    woher soll der compiler wissen, welcher wert er für stdValue nehmen soll ?
    deswegen nimmt er die version:

    template <class T>
    T GetAttributeValue(string attribute, string tag, string parent, T stdValue=T())
    {
    [...]
    }
    

    da weis er das er für den letzen parametern den standart-ctor aufrufen soll.



  • Nene, dass ist schon richtig so. Begründung steht hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=87869



  • EnERgYzEr schrieb:

    Gibt es einen (kostenlosen) Compiler, den man leicht in das VS integrieren
    kann und der auch problemlos DirectX Anwendungen, etc. kompilieren wird, ohne
    dass ich alles neuschreiben darf?

    Soweit ich weiß ist der neue MS Compiler kostenlos. Ob bzw. wie der sich allerdings ins ein altes Visual Studio integrieren lässt, weiß ich nicht.

    Oder hat doch noch irgendwer eine Lösung?

    Verzichte auf die Default-Parameter und benutze stattdessen Überladungen für zwei, drei und vier Parameter. Das kostet dich vier zusätzliche Funktionen. Da diese aber alle als reine forwarder implementiert werden können, ist dieser Preis zu verschmerzen.



  • HumeSikkins schrieb:

    Soweit ich weiß ist der neue MS Compiler kostenlos. Ob bzw. wie der sich allerdings ins ein altes Visual Studio integrieren lässt, weiß ich nicht.

    In .NET 2002 ist er super integrierbar - vorallem da sich an dem CLI des Compilers nicht viel geändert hat.

    Nicht selber getestet habe ich es beim VC++6 - aber ich habe gehört, dass es auch dort geht.



  • Ich hab momentan einfach auf die Default-Argumente verzichtet und mit
    wichtigeren Sachen weitergemacht. Ist aber schon interessant, dass man gleich
    bei den ersten Versuchen mit Templates auf Fehler und Bugs des Compilers
    stößt. Und das bei so einer einfachen Sache 🙄

    Mit dem neuen MS Compiler muss ich mal sehen, ob das klappt. Ich weiß auch
    nicht, warum es immer noch kein Service Pack für meine IDE gibt. Da sind
    so viele Bugs in dieser Oberfläche.... und jetzt auch noch Compiler-Bugs 😡

    Und stattdeßen bringen die innerhalb von zwei Jahren oder so zwei neue IDEs
    auf den Markt 😕. Für die alte IDE 6.0 gabs doch auch mindestens 5
    Service Packs. Warum nicht für diese Version?

    @Shade: Das hört sich ja gut an. Ich hab ja die 2002er Version.



  • Shade, welchen Compiler hast du denn integriert? Den aus der 2005er Beta
    oder aus dem .NET SDK 1.1 (ist da überhaupt ein C++ Compiler dabei?)? Oder
    einen ganz anderen?



  • Das Toolkit 2003



  • Hab das Toolkit 2003 installiert, aber der Bug besteht weiterhin - schade, aber
    lässt sich nun mal nicht ändern. Aber noch mal vielen Dank allen!


Anmelden zum Antworten