Partager via


Erreur du compilateur C3206

Mise à jour : novembre 2007

Message d'erreur

'fonction' : argument type non valide pour 'param', liste d'arguments type absente dans le type de classe 'NomType'
'function' : invalid type argument for 'param', missing type argument list on class type 'typename'

Un modèle de fonction est défini comme prenant un argument de type de modèle. Cependant, un argument template de modèle a été passé.

L'exemple suivant génère l'erreur C3206 :

// 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> >();
}

Résolution possible :

// C3206b.cpp
// compile with: /c
template <class T>
void f() {}

template <class T>
struct S {};

void f1() {
   f<S<int> >();
}

L'erreur C3206 peut également se produire lors de l'utilisation de génériques :

// C3206c.cpp
// compile with: /clr
generic <class GT1>
void gf() {}

generic <class T>
value struct GS {};

int main() {
   gf<GS>();   // C3206
}

Résolution possible :

// C3206d.cpp
// compile with: /clr
generic <class GT1>
void gf() {}

generic <class T>
value struct GS {};

int main() {
   gf<GS<int> >();
}

Cette erreur peut également être due à la mise en conformité du compilateur pour Visual C++ .NET 2003 : les modèles de classe ne sont pas autorisés comme argument de type de modèle.

Un modèle de classe n'est pas autorisé comme argument de type de modèle. Cela fonctionnait dans Visual C++ .NET 2003, mais n'est du code C++ valide.

Pour plus d'informations, consultez Récapitulatif des modifications sans rupture au moment de la compilation.

L'exemple suivant se compile sans problème dans C++ .NET 2002, mais échoue dans Visual C++ .NET 2003 :

// 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.
}

Résolution possible :

// C3206f.cpp
template <class T>
struct S {};

template <class T>
void func() {   // takes a type
   T t;
}

int main() {
   func<S<int> >();
}

Si un paramètre de modèle de modèle est nécessaire, pour corriger l'erreur dans les versions Visual C++ .NET 2003 et Visual C++ .NET 2002, il faut intégrer la fonction dans une classe de modèle qui prend un paramètre de modèle de modèle :

// 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();
}