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; }
答案知道帮助我,但我不认为这个问题是完全回答的.
解决方法
原文地址:https://www.jb51.cc/c/113719.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。