Clang:在拥有公共虚拟继承的同时,无法投放私人基础
clang: cannot cast to private base while there is a public virtual inheritance
我正在尝试编译以下代码(有点最小的示例),文件 test.cpp
:
#include <iostream>
#include <memory>
class Shared : public std::enable_shared_from_this<Shared>{
public:
int prea;
};
class Widget : public virtual Shared{
int a;
public:
~Widget(){
a = 7;
}
};
class Container : virtual public Widget{
};
class List : private Container, virtual public Widget{
public:
int c;
};
int main(int argc, char** argv){
auto c = std::make_shared<List>();
c->c = 3;
std::cout << c->c << std::endl;
return 0;
}
使用clang++
如下:
clang++ test.cpp -std=c++11
它给我以下错误:
/usr/bin/../lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/bits/shared_ptr_base.h:1106:50: error:
cannot cast 'List' to its private base class 'const enable_shared_from_this<Shared>'
__enable_shared_from_this_helper(_M_refcount, _M_ptr, _M_ptr);
^
请参阅此处的完整输出。
然后,如果我使用G 编译相同的代码,则没有错误,并且会产生可执行文件。我会说这是我期望的结果。不知道为什么clang 不喜欢代码。
那么,问题是谁是对的?clang++
或g++
?
编辑:即使在较小的示例中也可以复制:
#include <iostream>
#include <memory>
struct Shared : public std::enable_shared_from_this<Shared>{
};
struct Container : virtual public Shared{
};
struct List : private Container, virtual public Shared {
};
int main(int argc, char** argv){
auto c = std::make_shared<List>();
return 0;
}
我在clang-3.4.1及以后都看到了对此的支持,以及GCC-4.7.1及以后。编译器Explorer中的示例
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- Clang:在拥有公共虚拟继承的同时,无法投放私人基础