C++/STL: vector-Iterator in Kombination mit Template-Datentyp
steckl
- programmiertechnik
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
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;
}
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