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 VorlagenargumentenGruss
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
RemoveVectorElementkommt 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> {};