编译器错误 C3206

更新:2007 年 11 月

错误消息

“function”: “param”的类型参数无效,类类型“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();
}