Compilerfehler C3206
Aktualisiert: November 2007
Fehlermeldung
'Funktion': ungültiges Typargument für 'Param', fehlende Typargumentenliste für Klassentyp 'Typname'
'function' : invalid type argument for 'param', missing type argument list on class type 'typename'
Eine Vorlagenfunktion akzeptiert laut ihrer Definition ein Vorlagentypargument. Es wurde jedoch ein Vorlagenargument in Form einer Vorlage übergeben.
Im folgenden Beispiel wird C3206 generiert:
// C3206.cpp
template <class T>
void f() {}
template <class T>
struct S {};
void f1() {
f<S>(); // C3206
// try the following line instead
// f<S<int> >();
}
Mögliche Lösung:
// C3206b.cpp
// compile with: /c
template <class T>
void f() {}
template <class T>
struct S {};
void f1() {
f<S<int> >();
}
C3206 kann auch auftreten, wenn Generika verwendet werden:
// C3206c.cpp
// compile with: /clr
generic <class GT1>
void gf() {}
generic <class T>
value struct GS {};
int main() {
gf<GS>(); // C3206
}
Mögliche Lösung:
// C3206d.cpp
// compile with: /clr
generic <class GT1>
void gf() {}
generic <class T>
value struct GS {};
int main() {
gf<GS<int> >();
}
Dieser Fehler kann auch aufgrund einer Verbesserung der Compilerkonformität in Visual C++ .NET 2003 ausgegeben werden, nach der Klassenvorlagen nicht als Vorlagentypargument zulässig sind.
Eine Klassenvorlage darf nicht als Vorlagentypargument verwendet werden. Dies funktionierte in Visual C++ .NET 2003, ist jedoch ungültiges C++.
Weitere Informationen finden Sie unter Übersicht über die wichtigsten Änderungen bei der Kompilierzeit.
Der folgende Beispielcode wird in Visual C++ .NET 2002 kompiliert, verursacht in Visual C++ .NET 2003 jedoch einen Fehler:
// C3206e.cpp
template <class T>
struct S {};
template <class T>
void func() { // takes a type
T<int> t;
}
int main() {
func<S>(); // C3206 S is not a type.
}
Mögliche Lösung:
// C3206f.cpp
template <class T>
struct S {};
template <class T>
void func() { // takes a type
T t;
}
int main() {
func<S<int> >();
}
Wenn ein Vorlagenparameter erforderlich ist, kann das Problem sowohl für Visual C++ .NET 2003 als auch für Visual C++ .NET 2002 behoben werden, indem die Funktion in einer Vorlagenklasse gekapselt wird, die Vorlagen als Vorlagenparameter akzeptiert:
// C3206g.cpp
template <class T>
struct S {};
template<template<class> class TT>
struct X {
static void func() {
TT<int> t1;
TT<char> t2;
}
};
int main() {
X<S>::func();
}