编译器错误 C2990

“class”:已声明为类类型的非类类型

非泛型或模板类重新定义泛型或模板类。 检查标头文件是否存在冲突。

以下示例生成 C2990:

// C2990.cpp
// compile with: /c
template <class T>
class C{};
class C{};   // C2990

使用 generic 时,也可能发生 C2990:

// C2990b.cpp
// compile with: /clr /c
generic <class T>
ref struct GC;

ref struct GC {};   // C2990

C2990 也可能由于 Visual Studio 2005 的 Microsoft C++ 编译器中的中断性变更而发生;编译器现在要求同一类型的多个声明与模板规范相同。

以下示例生成 C2990:

// C2990c.cpp
// compile with: /c
template<class T>
class A;

template<class T>
struct A2 {
   friend class A;   // C2990
};

// OK
template<class T>
struct B {
   template<class T>
   friend class A;
};