作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现 clang 3.8.0 和 gcc 6.2.1 在处理我认为有效代码的方式上存在一些差异。这是一个示例,clang++ --std=c++11 vitest.cpp
编译时没有注释:
#include <iostream>
class Processor {
public:
Processor( int i, float f ) {}
virtual ~Processor() noexcept {}
virtual void getStatistics() = 0;
};
class PageProvider : virtual public Processor {
public:
PageProvider( int i, float f )
// : Processor{i,f} // Without this, GCC wants to call default ctor
{}
virtual ~PageProvider() {}
};
class QuotePageProvider : public PageProvider {
public:
QuotePageProvider( int i, float f )
: Processor{i,f},
PageProvider{i,f}
{}
virtual void getStatistics() { std::cout << "Hi there" << std::endl; };
};
int main( int argc, char* argv[] )
{
PageProvider* prov2{new QuotePageProvider{1,2.2}};
prov2->getStatistics();
delete prov2;
}
第一个异常是 g++(具有相同的命令行参数)提示 PageProvider 构造函数:
vitest.cpp:16:2: error: no matching function for call to ‘Processor::Processor()’
这可以通过取消注释 Processor 的显式初始化来解决,如上所示。根据aschepler's answer下面,这是一个已知的 gcc 错误。
去掉这些,事情变得更有趣了:
vitest.cpp: In constructor ‘QuotePageProvider::QuotePageProvider(int, float)’:
vitest.cpp:25:20: error: cannot allocate an object of abstract type ‘PageProvider’
PageProvider{i,f}
^
vitest.cpp:12:7: note: because the following virtual functions are pure within ‘PageProvider’:
class PageProvider : virtual public Processor {
^~~~~~~~~~~~
vitest.cpp:9:15: note: virtual void Processor::getStatistics()
virtual void getStatistics() = 0;
^~~~~~~~~~~~~
似乎 gcc 坚持要在 PageProvider
中实现 getStatistics() 以编译 QuotePageProvider
,而 clang 则没有。我得到相同的编译结果 with gcc 5.1 .
我可以通过执行以下任一操作说服 gcc 编译代码:
PageProvider
的构造函数的参数数量减少到 1(不考虑类型)。PageProvider
对 Processor
的继承成为非虚拟的。QuotePageProvider
的构造函数的初始化列表中,将 PageProvider
的初始化更改为使用括号而不是花括号。对上面 Processor
的初始化进行的类似更改没有任何效果。这是否可能是标准中的一些奇怪的极端情况,两个编译器的解释不同,或者其中一个被破坏了?
最佳答案
这是 gcc 错误 53878 .
抽象类不需要构造它的虚拟基类。
关于c++ - 为什么 clang 和 gcc 在这个虚拟继承代码上意见不一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431847/
我是一名优秀的程序员,十分优秀!