gpt4 book ai didi

c++ - 虚拟基类初始化难题

转载 作者:太空狗 更新时间:2023-10-29 23:04:15 24 4
gpt4 key购买 nike

我在静态库中有以下构造(调度程序机制的一部分,为简洁起见删除了不相关的细节):

class Base {
protected:
Base(Connection* conn = nullptr) : myConn(conn) {;} // = nullptr fixes the problem

Connection* myConn;
};

class Handler : virtual public Base {
public:
virtual void handleMessage(InputStream&) = 0;

protected:
Handler(int id) : myId(id) {;} <<<<< Error <<<<<<<

const int myId;
};

template<class EventType>
class TypedHandler : public Handler
{
protected:
TypedHandler() : Handler(EventType::ID) {;}

virtual void onEvent(const EventType&) = 0;

private:
virtual void handleMessage(InputStream& message)
{
EventType event(message);
onEvent( event );
}
};

我完全知道最派生的类应该初始化基类,它看起来像:

class A : public TypedHandler<SuperEvent>
, public TypedHandler<DuperEvent>
{
public:
A(Connection* conn) : Base(conn) {}

void onEvent(const SuperEvent&)
{ ... }

void onEvent(const DuperEvent&)
{ ... }
};

但我在标记位置(VS 2012,MSVC++ 11)收到“错误 C2512:没有合适的默认构造函数可用虚拟基类”,即使 Handler 从来都不是最派生的......

想法?

编辑:通过允许生成默认构造函数(通过构造函数中的 Connection* conn = nullptr),它可以工作。根据 Igor 的链接,默认构造函数不会在 Handler 构造函数中调用,因为 Handler 是虚拟的。

Edit2:通过将虚基类的默认构造函数设置为private,并将直接的两个子类设置为friends+非默认构造函数为protected,不仅编译通过,而且最派生类没有初始化的情况下编译失败虚基类正确。勾选所有复选框! :)

最佳答案

此问题已在 clang 3.4 中修复,但未在更早版本中修复。鉴于它是编译器错误或至少是有争议的编译器特征,并且Base(Connection& conn) 受到保护,您可以使用一个面对面的条件编译解决方法,例如

class Base {
protected:
#if HAVE_BUG_GCC19249
Base(Connection& conn = _workaround_bug_gcc19249_) : myConn(conn) {;}
#else
Base(Connection& conn) : myConn(conn) {;}
#endif

Connection& myConn;

#if HAVE_BUG_GCC19249
static Connection _workaround_bug_gcc19249_;
// ... conditional definition in implementation file.
#endif
};

关于c++ - 虚拟基类初始化难题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23229200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com