C模板基类编译器警告
我得到一个编译器警告,我不明白在这种情况下.当我从以下代码编译“Child.cpp”时. (不要奇怪:我把我的班级声明从最低限度上解除了,所以内容不会很有意义,但你会更快地看到问题).我在
VisualStudio2003和
VisualStudio2008的最高警戒级别得到警告.
代码 AbstractClass.h: #include <iostream> template<typename T> class AbstractClass { public: virtual void Cancel(); // { std::cout << "Abstract Cancel" << std::endl; }; virtual void Process() = 0; }; // Outside definition. If I comment out this and take the inline // definition like above (currently commented out),I don't get // a compiler warning. template<typename T> void AbstractClass<T>::Cancel() { std::cout << "Abstract Cancel" << std::endl; } Child.h: #include "AbstractClass.h" class Child : public AbstractClass<int> { public: virtual void Process(); }; Child.cpp: #include "Child.h" #include <iostream> void Child::Process() { std::cout << "Process" << std::endl; } 警告 “Child”类派生自“AbstractClass”.在“AbstractClass”中有公共方法“AbstractClass :: Cancel()”.如果我定义方法在类的外部(如你看到的代码),我得到编译器警告…
…当我编译“Child.cpp”.我不明白这一点,因为这是一个公共功能,编译器不知道我以后是否引用这个方法.而且,最后,我引用这个方法,因为我在main.cpp中调用它,尽管这个编译器警告,如果我编译并链接所有文件并执行程序,这个方法是有效的: //main.cpp #include <iostream> #include "Child.h" int main() { Child child; child.Cancel(); // Works,despite the warning } 如果我将Cancel()函数定义为inline(您将其看作是AbstractClass.h中的注释代码),那么我不会得到编译器警告.当然我的程序工作,但我想了解这个警告,还是这只是一个编译错误? 此外,如果不执行AbsctractClass作为模板类(在这种情况下仅用于测试目的),我也不会得到编译器警告…? 如果我做一个非虚拟函数,我没有得到非虚拟函数的编译警告,但是现在所有的答案都不包括虚拟的东西.尝试这个: template<typename T> class AbstractClass { public: virtual void Cancel(); // { std::cout << "Abstract Cancel" << std::endl; }; virtual void Process() = 0; void NonVirtualFunction(); }; //... template<typename T> void AbstractClass<T>::NonVirtualFunction() { std::cout << "NonVirtualFunction" << std::endl; } 答案知道帮助我,但我不认为这个问题是完全回答的. 解决方法
我在这里没有看到正确的答案:如果您在模板类中有纯虚拟方法,则Visual Studio会错误地报告此警告.在这种情况下,其他编译器(如gcc和clang)似乎没有报告此警告.
模板化或非模板化类中的纯虚拟方法是完全合理的,通常是一个好主意 – 将该方法声明为纯虚拟,迫使您在派生类中实现它. 我没有找到任何地方的引用作为一个错误 – 我不是在一个Microsoft开发人员程序,也许有人谁可以提出这个错误? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- React Native入门——组件构成及生命周期简介
- 「react-rainie-router」轻量的mobile移动端 react 路由,只
- cocos quick的代码加密
- 相同的字符串,从VB.net和PHP获得的不同SHA1哈希值
- Libpcap library/headers not found....
- Swift:无法使用类型'(@noescape(Int)throws – > Bool
- react-router学习笔记之入门
- Oracle EBS财务模块(四)账套
- 第十三章 对文本进行排序、单一和重复操作:sort命令、uniq
- ruby-on-rails – 如何使用RSpec测试CSV导入?