Problem mit Membertemplate



  • Hallo!
    Ich weiss nich wo das Problem bei diesem Membertemplate ist:

    template<class T>
    void ExtVec::RemoveVectorElement<T>(std::vector<T>& vec, size_t pos)
    {
    	std::vector<T> newvec;
    	for (size_t i=0; i<vec.size(); i++)
    		if (i != pos)
    			newvec.push_back(vec[i]);
    	vec = newvec;
    }
    

    Ich erhalte folgende Fehlermeldung:

    'ExtVec::RemoveVectorElement': Unzulässige Verwendung von expliziten Vorlagenargumenten
    

    Gruss
    Cartman



  • template<class T>
    void ExtVec::RemoveVectorElement(std::vector<T>& vec, size_t pos)
    {
        std::vector<T> newvec;
        for (size_t i=0; i<vec.size(); i++)
            if (i != pos)
                newvec.push_back(vec[i]);
        vec = newvec;
    }
    

    Nach RemoveVectorElement kommt kein <T> .



  • Das war tatsaechlich der Fehler, danke 🙂

    Gruss
    Cartman



  • mit dem <T> könntest du bei einem funktionsaufruf das template einen bestimmten typ typzuweisen was du in deinem beispiel ja nicht machen willst da der compiler dies für dich entscheiden soll

    diese <T> konstruktion gehört wie gesagt nicht dort hin



  • template<T> schrieb:

    mit dem <T> könntest du bei einem funktionsaufruf das template einen bestimmten typ typzuweisen was du in deinem beispiel ja nicht machen willst da der compiler dies für dich entscheiden soll

    diese <T> konstruktion gehört wie gesagt nicht dort hin

    Meinst du bei Spezialisierungen?

    Soviel ich nun gelesen hab ist es selbst dann nicht notwendig den Typ mit anzugeben, da dies der Compiler automatisch uebernimmt.

    template<>
    void ExtVec::RemoveVectorElement<int>(std::vector<T>& vec, size_t pos)
    {
        std::vector<T> newvec;
        for (size_t i=0; i<vec.size(); i++)
            if (i != pos)
                newvec.push_back(vec[i]);
        vec = newvec;
    }
    

    ist dasselbe wie

    template<>
    void ExtVec::RemoveVectorElement(std::vector<T>& vec, size_t pos)
    {
        std::vector<T> newvec;
        for (size_t i=0; i<vec.size(); i++)
            if (i != pos)
                newvec.push_back(vec[i]);
        vec = newvec;
    }
    

    Wann ist denn diese "Typdeduktion" denn nun noetig und wann nicht?
    oder hab ich da jetzt was falsch verstanden? 😕

    Gruss
    Cartman



  • Du kannst Funktionstemplates nicht partiell spezialisieren. Aber grundsätzlich musst du den Templateparameter (hier <T> ) beim Bezeichner nur hinschreiben, wenn du spezialisierst.

    Gleich wie bei Klassen:

    template <typename T, typename S>
    class MyClass {};
    
    template <typename S>
    class MyClass<int, S> {};
    

Anmelden zum Antworten