c++ - C++ 模板基类的编译器警告

标签 c++ templates compiler-warnings base-class

我收到一个编译器警告,在这种情况下我不明白。当我从以下代码编译“Child.cpp”时。 (不要奇怪:我将我的类声明剥离到最低限度,所以内容没有多大意义,但你会更快地看到问题)。我收到警告 Visual Studio 2003Visual Studio 2008处于最高警告级别。


代码

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”中有公共(public)方法“AbstractClass::Cancel()”。如果我在类主体之外定义方法(就像您看到的代码一样),我会收到编译器警告...

AbstractClass.h(7) : warning C4505: 'AbstractClass::Cancel' : unreferenced local function has been removed with [T=int]

...当我编译“Child.cpp”时。这个我不明白,因为这是一个public函数,编译器不知道我以后有没有引用这个方法。最后,我引用了这个方法,因为我在 main.cpp 中调用它,尽管有这个编译器警告,但如果我编译并链接所有文件并执行程序,这个方法仍然有效:

//main.cpp
#include <iostream>
#include "Child.h"

int main()
{
    Child child;
    child.Cancel();  // Works, despite the warning
}

如果我确实将 Cancel() 函数定义为内联(您将其视为 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++ 模板基类的编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3051992/

相关文章:

c++ - 使用 Boost.Asio 强制异步套接字读取提前完成

c++ - 如何删除Qtreewidget中的虚线分支

c++ - 在Qt中使Qlabel可点击或双击

javascript - vue.js 的 <template> 语法不起作用

c++ - 对 C++ 11 可变模板参数进行操作,存储到元组中

IOS swift 项目与 Facebook 集成 : tons of warnings

c++ - 在桌面程序中嵌入 NoSQL 文档/EAV 数据库,如 SQLite3,但 NoSQL?

templates - 使用 `std::vector` 作为模板模板参数的默认值

c++ - 针对 unsigned int 上的一元运算的编译器警告

c++ - 动态分配内存时的警告