steckl: C++/STL: vector-Iterator in Kombination mit Template-Datentyp

Hi,

folgender Code führt bei mir zu einem Compiler-Fehler:

  
#include <iostream>  
#include <vector>  
  
using namespace std;  
  
template<class T>  
T blubb(T a) {  
  
	vector<T> v1(a);  
	vector<T>::iterator it1;  // Zeile 10  
	// Folgende Zeile wird einwandfrei compiliert:  
	// vector<int>::iterator it1;  
	return a;  
}  
  
int main(void)  
{  
	cout << blubb(4);  
	return 0;  
}  

Die Fehlermeldung ist:

  
test1.cpp: In function »T blubb(T)«:  
test1.cpp:10: Fehler: expected `;' before »it1«  
test1.cpp: In function »T blubb(T) [with T = int]«:  
test1.cpp:16:   instantiated from here  
test1.cpp:10: Fehler: Abhängigenname »std::vector<T,std::allocator<_CharT> >::iterator« wird als Nicht-Typ erkannt, aber die Instanziierung liefert einen Typ  
test1.cpp:10: Anmerkung: »typename std::vector<T,std::allocator<_CharT> >::iterator« sagen, wenn ein Typ gemeint ist  

Wenn ich für den Iterator nichtmehr den Template-Datentyp T sondern "int" angebe meckert der Compiler nicht mehr.
Das komischste ist aber, dass es bei mir unter Ubuntu nicht funktioniert den Code zu compilieren, aber bei einem Freund unter Windows mit Visual C++ und auch mit Intel-Compiler schon.
Kann ich irgendetwas machen, damit der Code auch mit g++ compiliert wird?

Hier noch meine Compiler-Version:
 g++ -v
Es werden eingebaute Spezifikationen verwendet.
Ziel: i486-linux-gnu
Konfiguriert mit: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread-Modell: posix
gcc-Version 4.2.4 (Ubuntu 4.2.4-1ubuntu3)

mfG,
steckl

  1. warum versuchst du es nicht mit dieser anmerkung?
    test1.cpp:10: Anmerkung: »typename std::vector<T,std::allocator<_CharT> >::iterator« sagen, wenn ein Typ gemeint ist

      
    template<class T>  
    T blubb(T a) {  
      
            vector<T> v1(a);  
            typename vector<T>::iterator it1;  // Zeile 10  
            // Folgende Zeile wird einwandfrei compiliert:  
            // vector<int>::iterator it1;  
            return a;  
    }  
    
    
    1. Hi,

      warum versuchst du es nicht mit dieser anmerkung?
      test1.cpp:10: Anmerkung: »typename std::vector<T,std::allocator<_CharT> >::iterator« sagen, wenn ein Typ gemeint ist

      typename vector<T>::iterator it1;  // Zeile 10

        
      Vielen Dank, das wars.  
      Konnte nur nichts mit dieser Anmerkung anfangen, weil ich das Schlüsselwort typename noch nie vorher gesehen habe.  
        
      mfG,  
      steckl