奇怪的是重复出现的模板图案:双继承

Curiously recurring template patterm: double inheritance

本文关键字:继承      更新时间:2023-10-16

我有以下内容:

class Base
{
protected:
    std::string _name;
public:
    virtual ~Base(){}
    const std::string &name;
    Base()
        : _name ("(no name)")
        , name(_name)
    {}
};
template <typename T>
class BaseH : public Base
{
public:
    virtual ~BaseH() {}
    BaseH() : Base() {}
    T& operator~(){ ; return static_cast<T&>(*this);}
};
class One : public BaseH<One>
{
public:
    One() : BaseH<One>() { _name = "One"; }
};
class Two
    : public One
    , public BaseH<Two>
{
public:
    Two() : BaseH<Two>() { _name = "Two"; }
};

int main(int argc, char *argv[])
{
    std::cout << Two().name << std::endl;
    return 0;
}

我想从OneBaseH<Two>派生Two,因为TwoOne的专业化,并且BaseH中的operator~必须始终返回调用它的对象类型的引用。

汇编错误显然是:

In constructor ‘Two::Two()’:
  error: reference to ‘_name’ is ambiguous
  error: candidates are: std::string Base::_name
  error:                 std::string Base::_name
In function ‘int main(int, char**)’:
  error: request for member ‘name’ is ambiguous
  error: candidates are: const string& Base::name
  error:                 const string& Base::name

在通过构造委员会设置const引用时,如何在OneTwo中访问_namename?最清洁的方法是什么?

看起来您有钻石问题。您是否尝试过虚拟继承?

例如:

template <typename T>
class BaseH : virtual public Base
{
    // ...
};
class One : virtual public BaseH<One>
{
    // ...
};

编辑:有关钻石问题的进一步阅读:http://www.cprogramming.com/tutorial/virtual_inheritance.html