Любопытно повторяющийся шаблон: двойное наследование

У меня есть следующее:

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;
}

Я хочу вывести Two от обоих One а также BaseH<Two>, так как Two это специализация Oneи operator~ в BaseH всегда должен возвращать ссылку на тип объекта, который его вызывает.

Ошибки компиляции очевидны:

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

Как мне сделать _name а также name доступны в обоих One а также Twoпри настройке const ссылки через конструктор делегирования? Какой самый чистый способ сделать это?

2

Решение

Похоже, у вас есть алмазная проблема. Ты пытался виртуальное наследство?

например.:

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

class One : virtual public BaseH<One>
{
// ...
};

редактировать: дальнейшее чтение по проблеме алмазов здесь: http://www.cprogramming.com/tutorial/virtual_inheritance.html

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]