У меня есть следующее:
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
ссылки через конструктор делегирования? Какой самый чистый способ сделать это?
Похоже, у вас есть алмазная проблема. Ты пытался виртуальное наследство?
например.:
template <typename T>
class BaseH : virtual public Base
{
// ...
};
class One : virtual public BaseH<One>
{
// ...
};
редактировать: дальнейшее чтение по проблеме алмазов здесь: http://www.cprogramming.com/tutorial/virtual_inheritance.html
Других решений пока нет …