Template Problem

Kaiser206

Erfahrenes Mitglied
Hallo,

ich habe folgenden Code:

Code:
template < typename T>
void abc()
{
        std::vector<T>::iterator it;
}

Könnte mir jemand erklären was daran falsch ist, und wie man dieses Problem sonst lösen könnte?

mfg
kaiser206
 
Hi.
Ich kann hier keinen Fehler erkennen. Welches Problem hast du denn damit?
Das Problem ist, das vector ein Template ist welches von dem Templateparameter T der Funktion abhängt. So kann nicht festgestellt werden ob "iterator" nun ein Typ oder ein Attribut/Methode bei der Instanzierung ist.

Man muss typename verwenden:
C++:
template < typename T>
void abc()
{
        typename std::vector<T>::iterator it;
}
Gruß
 
Das Problem ist, das vector ein Template ist welches von dem Templateparameter T der Funktion abhängt. So kann nicht festgestellt werden ob "iterator" nun ein Typ oder ein Attribut/Methode bei der Instanzierung ist.
Der Compiler von VS2008 scheint es irgendwie doch feststellen zu können, da er diesen Code auch ohne typename kompiliert. Etwas anderes hatte ich zum Zeitpunkt meines Beitrages gerade nicht zur Hand.

Grüße, Matthias
 
Bei der Instanzierung kann es jeder Compiler feststellen, aber dann sollte es eigentlich einen Fehler geben weil iterator ursprünglich nicht als Typ geparst wurde. Scheinbar arbeitet der VS Compiler mehr nach dem DWIM Prinzip :)
Auch mit einer Instanzierung meckert VS nicht. Vielleicht erkennt der VS-Compiler, dass der Ausdruck unabhängig von der konkreten Wahl von T immer einen Typnamen ergibt. Gäbe es denn in diesem Fall eine Instanzierung, in der der Ausdruck keinen Typnamen ergibt?

Grüße, Matthias
 
Auch mit einer Instanzierung meckert VS nicht.
Ja, ich hatte es auch ausprobiert.
Vielleicht erkennt der VS-Compiler, dass der Ausdruck unabhängig von der konkreten Wahl von T immer einen Typnamen ergibt. Gäbe es denn in diesem Fall eine Instanzierung, in der der Ausdruck keinen Typnamen ergibt?
Nein, in dem Fall wohl nicht, da es keine Spezialisierung von std::vector gibt wo iterator kein typedef ist.

C++:
template <typename T>
struct A {
	typedef int xt;
};

template <>
struct A<bool> {
	static void xt(int i) {
		// 
	}
};


template < typename T>
void abc()
{
	typename A<T>::xt(5);
}

abc<int>();
abc<bool>();
Wie es scheint ignoriert der Microsoft Compiler das Schlüsselwort typename innerhalb von Template-Funktionen völlig. :confused:

Mit dem GCC gibt es einen Fehler bei int-Instanzierung ohne typename und bei bool-Instanzierung mit typename Schlüsselwort:
Code:
Test.cpp: In function `void abc() [with T = int]':
Test.cpp:29:   instantiated from here
Test.cpp:24: error: dependent-name ` A<T>::xt' is parsed as a non-type, but instantiation yields a type
Test.cpp:24: note: say `typename  A<T>::xt' if a type is meant
Code:
Test.cpp: In function `void abc() [with T = bool]':
Test.cpp:30:   instantiated from here
Test.cpp:24: error: no type named `xt' in `struct A<bool>'
Das Beispiel ist sicherlich etwas weit hergeholt und ist womöglich niemals in freier Wildbahn anzutreffen, aber ich stelle mir gerade vor einen solchen Fehler in einer komplexen Klassenhierarchie mit dem Visual Studio finden zu müssen... :eek:

\edit: Evlt. ist es sinnvoll dies so definieren zu können? Wenn ich mich recht erinnere, war die typename Vorschrift mal in der Diskussion, aber auf die Schnelle scheint es keine Anzeichen zu geben, dass dies im c++0x Standard geändert wird.

Gruß
 
Zuletzt bearbeitet:
Zurück