
代码
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()”.如果我定义方法在类的外部(如你看到的代码),我得到编译器警告…
AbstractClass.h(7) : warning C4505: ‘AbstractClass::Cancel’ : unreferenced local function has been removed
with [T=int]
…当我编译“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开发人员程序,也许有人谁可以提出这个错误?
总结以上是内存溢出为你收集整理的C模板基类编译器警告全部内容,希望文章能够帮你解决C模板基类编译器警告所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)