Schon wieder Probleme mit Templates -.-



  • die dinger mögen mich nicht 😞

    Diesesmal weiß ich aber nicht, ob es an mir oder am veralteten Compiler liegt

    folgendes Konstrukt:

    class MyClass
    {
    public:
        template<class T>
            inline std::map<int, T> getMap() const;
    
    private:
        std::map<int, Enum1> _enum1_map;
        std::map<int, Enum2> _enum2_map;
    };
    
    template<>
    inline std::map<int, Enum1> MyClass::getMap() const
    {
        return _enum1_map;
    }
    
    template<>
    inline std::map<int, Enum2> MyClass::getMap() const
    {
        return _enum2_map;
    }
    
    ...
    

    kurzum: welche Member zurückgegeben wird, entscheidet das Template.

    unter gcc 4.3.2 kompiliert es brav durch

    unter SUN C++ 5.8 kommt folgender Fehler:

    Error: Could not find a match for MyClass::getMap<MyClass::T>() const.
    


  • Und in welcher Zeile kommt der Fehler? 🙄

    Ad veralteter Compiler: Der C++-Compiler von SIEMENS z.B. kommt nicht mit Funktionstemplates klar, wenn die Templateparameter nicht in der Liste der Funktionsparameter benutzt werden.

    EDIT:
    Müsste die Spezialisierung nicht so lauten? (Kenne mich mit Funktionstemplatespezialisierungen nicht so aus, weil ich sie meide wie der Teufel das Weihwasser 🙂 )

    template<> 
    std::map< int, Enum1 > MyClass::getMap< Enum1 >() const
    

    Warum nimmst Du keine Überladungen?



  • LordJaxom schrieb:

    Und in welcher Zeile kommt der Fehler? 🙄

    im obigen Beispiel Zeile 13

    LordJaxom schrieb:

    Ad veralteter Compiler: Der C++-Compiler von SIEMENS z.B. kommt nicht mit Funktionstemplates klar, wenn die Templateparameter nicht in der Liste der Funktionsparameter benutzt werden.

    sieht gut aus, kompiliert bisher brav durch. Schonmal danke



  • LordJaxom schrieb:

    EDIT:
    Müsste die Spezialisierung nicht so lauten? (Kenne mich mit Funktionstemplatespezialisierungen nicht so aus, weil ich sie meide wie der Teufel das Weihwasser 🙂 )

    template<> 
    std::map< int, Enum1 > MyClass::getMap< Enum1 >() const
    

    klappt beides, also nehm ich erstmal das, was kürzer ist 😉

    Warum nimmst Du keine Überladungen?

    Das hätte ich gemacht, wenn der Compiler es nicht geschluckt hätte. Ich wollt einfach mal sehen, ob das so klappt



  • zwutz schrieb:

    Das hätte ich gemacht, wenn der Compiler es nicht geschluckt hätte. Ich wollt einfach mal sehen, ob das so klappt

    Ich muss anfügen, dass der Hinweis sowieso quatsch war, da man Funktionen ja garnicht nur anhand ihres Rückgabetyps überladen kann. Das funzt sowieso nur, wenn der Templateparameter auch Funktionsparameter ist.


Anmelden zum Antworten