编译器错误 C2989
2016-09-13 09:06
495 查看
前几天开发遇到非类模板已经声明为类模板,,微软知识库中有说明
但是还有一种情况,微软没提到,就是 当模板函数返回类型为enum时候
“class” : 类类型已声明为非类类型
类泛型或模板重定义非模板或非泛型类。检查头文件中是否有冲突。
如果您在使用类模板部分专用化,请参见知识库文章 Q240866。
下面的示例生成 C2989:
使用泛型时也可能发生 C2989:
来源: https://msdn.microsoft.com/zh-cn/library/b25sbd9x.aspx
原因是编译器把enunm_type当成模板了。
个人怀疑又是编译器的原因。GCC编译器应该能认出enum而不是template,没做验证,不过VS编译器经常干这种事……
但是还有一种情况,微软没提到,就是 当模板函数返回类型为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编译器经常干这种事……
相关文章推荐
- 微软无线镭射简报鲨8000激光笔记本鼠标 - (2)
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- 浅谈汇编器、编译器和解释器
- 让我们做个简单的解释器(三)
- 让我们做个简单的解释器(一)
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- 微软镜像下载
- 用 350 行代码从零开始,将 Lisp 编译成 JavaScript
- 微软公布2013年必应搜索十大首页美图
- 微软Word 2007数学插件 Microsoft Math 提供下载
- 巧用微软EWF来保护系统
- 微软又爆预留后门 警方可轻松获取硬盘资料
- 微软推DreamSpark计划为学生提供免费软件下载地址
- 基于JSP编译器基本语法的使用详解
- C#命令行编译器配置方法
- Java虚拟机JVM性能优化(二):编译器
- AngularJS HTML编译器介绍
- Visual C++ on linux的使用
- 实现接口时@Override注解问题