Compartir a través de


Error del compilador C3206

Actualización: noviembre 2007

Mensaje de error

'función': argumento de tipo no válido para 'param', falta lista de argumentos en tipo de clase 'nombre de tipo'
'function' : invalid type argument for 'param', missing type argument list on class type 'typename'

Se ha definido una función de plantilla que toma un argumento de tipo de plantilla. Sin embargo, se ha transferido un argumento de plantilla de plantilla.

El ejemplo siguiente genera el error 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> >();
}

Posible solución:

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

template <class T>
struct S {};

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

El error C3206 también puede producirse cuando se utilizan genéricos:

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

generic <class T>
value struct GS {};

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

Posible solución:

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

generic <class T>
value struct GS {};

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

Este error también puede producirse como resultado del trabajo de conformidad del compilador realizado para Visual C++ .NET 2003; no se permite el uso de plantillas de clase como argumento de tipo de plantilla.

No se permite el uso de una plantilla de clase como argumento de tipo de plantilla. Esto era válido en Visual C++ .NET 2003, pero no lo es en C++.

Para obtener más información, vea Resumen de cambios importantes en tiempo de compilación.

El siguiente ejemplo compila en Visual C++ .NET 2002, pero genera errores en 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.
}

Posible solución:

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

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

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

Si es necesario utilizar un parámetro de plantilla de plantilla, la corrección del error válida para las versiones Visual C++ .NET 2003 y Visual C++ .NET 2002 requerirá ajustar la función en una clase de plantilla que tome un parámetro de plantilla de plantilla:

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