编译器错误 C2989

来源:互联网 发布:java中跨行跨列 编辑:程序博客网 时间:2024/06/06 09:17

前几天开发遇到非类模板已经声明为类模板,,微软知识库中有说明
但是还有一种情况,微软没提到,就是 当模板函数返回类型为enum时候

下面是微软的说明

编译器版本 Visual Studio 2013
“class” : 类类型已声明为非类类型
类泛型或模板重定义非模板或非泛型类。检查头文件中是否有冲突。
如果您在使用类模板部分专用化,请参见知识库文章 Q240866。
下面的示例生成 C2989:

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

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

// C2989b.cpp// compile with: /clr /cref class GC1;generic <typename T> ref class GC1; // C2989template <typename T> ref class GC2;generic <typename T> ref class GC2; // C2989generic <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.cppenum 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编译器经常干这种事……

0 0
原创粉丝点击