Поделиться через


Ошибка компилятора C3206

Обновлен: Ноябрь 2007

Сообщение об ошибке

"функция" : недопустимый аргумент параметра "параметр", отсутствует список аргументов типа для типа класса "имя_типа"
'function' : invalid type argument for 'param', missing type argument list on class type 'typename'

Шаблон функции определен как принимающий аргумент типа шаблона. Однако аргумент шаблона "шаблон" передан.

Следующий пример демонстрирует причины возникновения ошибки 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> >();
}

Возможный способ устранения данной ошибки:

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

template <class T>
struct S {};

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

Ошибка C3206 также может возникнуть при использовании универсальных шаблонов:

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

generic <class T>
value struct GS {};

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

Возможный способ устранения данной ошибки:

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

generic <class T>
value struct GS {};

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

Эта ошибка может возникнуть и в результате работы согласованности компилятора, выполненной для Visual C++ .NET 2003, где шаблоны класса недопустимы в качестве аргументов типа шаблона.

Шаблон класса недопустим в качестве аргумента типа шаблона. Это работало в Visual C++ .NET 2003, но недопустимо в C++.

Дополнительные сведения см. в разделе Сводная информация о критических изменениях, которые могут приводить к ошибкам компиляции.

Следующий пример согласуется в Visual C++ .NET 2002, но завершится неудачей в 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.
}

Возможный способ устранения данной ошибки:

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

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

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

Если параметр шаблона "шаблон" необходим, то разрешение ошибки, действительное в обеих версиях (Visual C++ .NET 2003 и Visual C++ .NET 2002), требует чтобы функция была заключена в класс шаблона, принимающего параметр шаблона "шаблон":

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