您的位置:首页 > 其它

编译器错误 C2989

2016-09-13 09:06 495 查看
前几天开发遇到非类模板已经声明为类模板,,微软知识库中有说明

但是还有一种情况,微软没提到,就是 当模板函数返回类型为enum时候

下面是微软的说明

编译器版本 Visual Studio 2013

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

类泛型或模板重定义非模板或非泛型类。检查头文件中是否有冲突。

如果您在使用类模板部分专用化,请参见知识库文章 Q240866。

下面的示例生成 C2989:

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


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

// C2989b.cpp
// compile with: /clr /c
ref class GC1;
generic <typename T> ref class GC1; // C2989
template <typename T> ref class GC2;
generic <typename T> ref class GC2; // C2989
generic <typename T> ref class GCb;
template <typename T> ref class GC2;
generic <typename T> ref class GCc;


来源: https://msdn.microsoft.com/zh-cn/library/b25sbd9x.aspx

模板函数返回值为enum类型

下面的示例生成C2989

// compile with: /c// enum.cpp
enum enunm_type
{
MAT_INT8 = 1;
MAT_INT16 = 2;
MAT_INT32 = 3;
//....
}
template<typename Dtype> enmu enunm_type fun() // C2989
{
//....
return MAT_INT8;
}


原因是编译器把enunm_type当成模板了。

解决方法

把enum关键字删掉。

个人怀疑又是编译器的原因。GCC编译器应该能认出enum而不是template,没做验证,不过VS编译器经常干这种事……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息