MSVC fehler bei iterator_traits?
-
Liegt es wiedermal an einer fehlerhaften implementation des MSVCs oder hab ich was falsch gemacht? (Ist nur ne stark vereinfachte Version, der Fehler tritt trotzdem auf).
#include <vector> #include <iterator> using namespace std; template <typename I> void foo (I & i) { iterator_traits<I>::value_type x; } int main () { vector<int>::iterator i; foo(i); return 0; }
nicht zu vergessen die Fehlermeldungen:
d:\programme\microsoft visual studio\vc98\include\utility(81) : error C2039: 'iterator_category' : Ist kein Element von '
global namespace'' g:\\matthias\\vst\_sdk\\steinberg's vst plugins sdk v20\\vstsdk2\\fobar\\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator\_traits<int *>' g:\\matthias\\vst\_sdk\\steinberg's vst plugins sdk v20\\vstsdk2\\fobar\\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void \_\_cdecl foo(int *& )' d:\\programme\\microsoft visual studio\\vc98\\include\\utility(81) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'iterator_category' g:\\matthias\\vst\_sdk\\steinberg's vst plugins sdk v20\\vstsdk2\\fobar\\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator\_traits<int *>' g:\\matthias\\vst\_sdk\\steinberg's vst plugins sdk v20\\vstsdk2\\fobar\\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void \_\_cdecl foo(int *& )' d:\\programme\\microsoft visual studio\\vc98\\include\\utility(81) : error C2868: 'iterator_category' : Unzulaessige Syntax fuer using-Deklaration; vollstaendiger Name erwartet g:\\matthias\\vst\_sdk\\steinberg's vst plugins sdk v20\\vstsdk2\\fobar\\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator\_traits<int *>' g:\\matthias\\vst\_sdk\\steinberg's vst plugins sdk v20\\vstsdk2\\fobar\\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void \_\_cdecl foo(int *& )' d:\\programme\\microsoft visual studio\\vc98\\include\\utility(82) : error C2039: 'value_type' : Ist kein Element von '
global namespace''
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator_traits<int *>'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl foo(int *& )'
d:\programme\microsoft visual studio\vc98\include\utility(82) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'value_type'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator_traits<int *>'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl foo(int *& )'
d:\programme\microsoft visual studio\vc98\include\utility(82) : error C2868: 'value_type' : Unzulaessige Syntax fuer using-Deklaration; vollstaendiger Name erwartet
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator_traits<int *>'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl foo(int *& )'
d:\programme\microsoft visual studio\vc98\include\utility(83) : error C2039: 'distance_type' : Ist kein Element von '`global namespace''
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator_traits<int *>'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl foo(int *& )'
d:\programme\microsoft visual studio\vc98\include\utility(83) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'distance_type'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator_traits<int *>'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl foo(int *& )'
d:\programme\microsoft visual studio\vc98\include\utility(83) : error C2868: 'distance_type' : Unzulaessige Syntax fuer using-Deklaration; vollstaendiger Name erwartet
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(9) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::iterator_traits<int *>'
g:\matthias\vst_sdk\steinberg's vst plugins sdk v20\vstsdk2\fobar\test.cpp(15) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl foo(int *& )'
-
Hallo,
die Fehler liegen im Typ von std::vector<T>::iterator begründet. Der Typ von std::vector<T>::iterator ist T*. Da T* natürlich keine internen typedefs hat, iterator_traits aber auf genau solche zugreift (z.B. T::value_type) und da der VC keine partiellen Spezialisierungen für iterator_traits zur Verfügung stellt, bekommst du die Probleme.
-
Hast du auch einen Vorschlag, was ich jetzt machen kann?
-
Ich brauche einen Workaround. :p
-
Hast du auch einen Vorschlag, was ich jetzt machen kann?
Keinen allgemein gültigen. Für bestimmte Sachen gibt es Workaround, für andere nicht.
Generell ist der value-type eines T* ein simples T. Ohne partielle Spezialisierung gibt es aber leider keine Möglichkeit aus einem T* ein T zu machen so das dieses T dann zur Deklaration eines Objekts verwendet werden kann.
Was genau willst du denn erreichen?
-
@unregistrierten Helium: Was soll das?
@HumeSikkins: Naja, es geht um einen Algorithmus, der mit allen Iteratoren laufen soll. Und ich brauche den "Valuetype" innerhalb des Algorythmus. Ich mein ich könnte den Benutzer dazu zwingen einen Dummy-Parameter zu übergeben, aber das ist irgendwie doof.
-
Hallo,
na das lässt sich zum Glück erreichen.// Implementation des Algos - für den User nicht sichtbar/relevant template <class Iter, class ValueType> void AlgoImpl(Iter it, ValueType* p) { ValueType q = ValueType(); cout << typeid(ValueType).name() << endl; } // Schnittstelle für den User: template <class Iter> void Algo(Iter it) { // _Val_type(it) wird vom VC 6 mitgeliefert AlgoImpl(it, _Val_type(it)); } int main() { vector<int>::iterator it; Algo(it); // -> int map<int, int>::iterator mit; Algo(mit); // -> pair<const int, int> }
-
Funzt, danke.