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?



  • @HumeSikkins

    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.


Anmelden zum Antworten