C++ 英特尔C&x2B+;编译器和Wnon虚拟dtor标志给出(错误?)警告
我试图编译我的一些代码,在g++中(带有--Wnon virtual dtor标志)编译得很好。而且,我的IDE和ClangTidy没有警告我(我认为这当然可能是错误的) 当我试图用英特尔的icpc编译相同的代码时(实际上这是一个C++ 英特尔C&x2B+;编译器和Wnon虚拟dtor标志给出(错误?)警告,c++,compiler-warnings,icc,virtual-destructor,C++,Compiler Warnings,Icc,Virtual Destructor,我试图编译我的一些代码,在g++中(带有--Wnon virtual dtor标志)编译得很好。而且,我的IDE和ClangTidy没有警告我(我认为这当然可能是错误的) 当我试图用英特尔的icpc编译相同的代码时(实际上这是一个icpc(ICC)19.1.2.254 20200623),我得到了一个警告,我现在能够追踪到它——我想知道我是不是有什么过错,或者这个警告在我的情况下是否真的不正确 我写了一个关于我的类层次结构的小例子: template<typename T> clas
icpc(ICC)19.1.2.254 20200623
),我得到了一个警告,我现在能够追踪到它——我想知道我是不是有什么过错,或者这个警告在我的情况下是否真的不正确
我写了一个关于我的类层次结构的小例子:
template<typename T>
class B {
public:
B() = default;
virtual ~B() = default;
};
template<typename T>
class C : public B<T> {
public:
C() = default;
~C() override = default;
virtual int foo() { return 0; };
};
template<typename T>
class D : public C<T> {
public:
D() = default;
~D() override = default;
int foo() override { return 1; };
};
int main() {
return 0;
}
可以通过明确声明C中的析构函数是虚拟的(因此virtual~C()override=default;
)来消除这种情况
注意,去掉模板也可以让代码在没有任何警告的情况下编译
最后,去掉foo成员函数将使代码在没有警告的情况下编译
所以是的-我的问题是:这是icpc中的一个“错误”还是我做错了什么
我真的找不到任何有用的警告
提前感谢,,
Flusslauf好的,所以在发布这篇文章之后——这似乎是编译器中的一个(非常不重要的)错误——解决方法是同时编写,
虚拟
和重写
cpp核心指南中的项目(与评论中的链接相同)不鼓励这样做,但没有问题。您标记了这个[c++14]?警告似乎是指“一些项目14”在一些编码标准,即通常是一个好的设计思想,并没有任何与ISO C++ 14,所以你有其他原因的C++版本标签?是的-我不好,我认为关键字是WONG…override作为一个关键字从c++11开始提供,我想表达一下。我认为这个警告实际上是以一种或另一种方式与问题有关,但我认为它在这里并不完全正确。一个重写的函数在默认情况下是虚拟的-我认为不应该为某个虚拟函数编写默认的int foo()重写,而应该编写int foo()重写-对于析构函数等也是一样-是的,没有模板就不会发生我在guidlines中的意思是:一个函数应该指定一个重写,final,而且是虚拟的。有效的C++项目实际上是指Scott Meyers书《有效的现代C++》I TINK,但我没有版本的项目。
foo.cpp(15): warning #2026: Effective C++ Item 14 Make sure base classes C have virtual destructors
};
^