编译器错误 C3203

更新:2007 年 11 月

错误消息

“type”: 非专用的类类型不能用作类型参数“param”的类型变量,应为 real 类型

您向类模板或泛型传递的参数无效。该类模板或泛型预期一种类型作为参数。

对 Visual C++ 2005 所做的编译器一致性工作可能导致此错误:非专用的类模板不能用作基类列表中的模板参数。若要消除 C3203,请在将模板类型参数用作基类列表中的模板参数时,显式将其添加到模板类名称。有关更多信息,请参见 Visual C++ 2005 编译器中的重大更改

// C3203.cpp
template< typename T >
struct X {
   void f(X) {}
};

template< typename T >
struct Y : public X<Y> {   // C3203
// try the following line instead
// struct Y : public X<Y<T> > {
   void f(Y) {}
};

int main() {
   Y<int> y;
}

下面的示例生成 C3203:

// C3203_b.cpp
// compile with: /c
template <class T>
struct S1 {};

template <class T>
class C1 {};

typedef C1<S1> MyC1;   // C3203

// OK
template <template <class> class T>
class C2 {};

typedef C2<S1> MyC1;

template <class T>
class C3 {};

typedef C3<S1<int> > MyC12;

使用泛型时也可能发生 C3203:

// C3203_c.cpp
// compile with: /clr /c
generic <class T>
value struct GS1 {};

generic <class T>
value struct GC1 {};

typedef GC1<GS1> MyGC1;   // C3203
typedef GC1<GS1<int> > MyGC2;   // OK