Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 英特尔C&x2B+;编译器和Wnon虚拟dtor标志给出(错误?)警告_C++_Compiler Warnings_Icc_Virtual Destructor - Fatal编程技术网

C++ 英特尔C&x2B+;编译器和Wnon虚拟dtor标志给出(错误?)警告

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

我试图编译我的一些代码,在g++中(带有--Wnon virtual dtor标志)编译得很好。而且,我的IDE和ClangTidy没有警告我(我认为这当然可能是错误的)

当我试图用英特尔的icpc编译相同的代码时(实际上这是一个
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
  };
   ^