C模板基类编译器警告

我得到一个编译器警告,我不明白在这种情况下.当我从以下代码编译“Child.cpp”时. (不要奇怪:我把我的班级声明从最低限度上解除了,所以内容不会很有意义,但你会更快地看到问题).我在 VisualStudio2003VisualStudio2008的最高警戒级别得到警告.

代码

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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...