Как получить доступ к защищенной переменной-члену родительского базового класса шаблона в рамках наследования алмазов

У меня есть более сложная версия следующего кода в большом проекте.

template <class classT>
class Base{
private:
protected:
classT var;
public:
classT getVar(){return var;}
void setVar(classT varIn){var = varIn;}
};

class Base2{
private:
std::string name;
public:
std::string getName(){return name;}
void setName(std::string nameIn){name = nameIn;}
virtual void printVars(){std::cout << '*' << name << std::endl;}
};

class Child1: public virtual Base2, public virtual Base<int>{
private:
public:
virtual void printVars(){std::cout << ':' << getName() << std::endl;}
};

class Child2: public virtual Base2, public virtual Base<char>{
private:
public:
virtual void printVars(){std::cout << '-' << getName() << std::endl;}
};

class GChild1: public virtual Child1, public virtual Child2, public virtual Base2, public virtual Base<std::string>{
private:
public:
using Base<std::string>::getVar;
using Base<std::string>::setVar;
virtual void printVars(){std::cout << var << std::endl;}
};

Всякий раз, когда я пытаюсь скомпилировать приведенный выше код, я получаю следующую ошибку.

error: reference to 'var' is ambiguous

Я понимаю, что в этом случае в GChild1 есть несколько переменных с таким именем: Base :: var через Child1, Base :: var через Child2 и Base :: var через GChild1. Я также понимаю, что могу решить эту проблему, если быть более конкретным и использовать оператор области действия. Однако я не понимаю, почему добавление строки «использование» в определение GChild1 не решает эту проблему. Например

class GChild1: public virtual Child1, public virtual Child2, public virtual Base<std::string>{
private:
using Base<std::string>::var;
public:
/* Same Code */
}

Это приводит к той же ошибке. Я видел похожие вопросы, задаваемые, но я чувствовал, что они либо были достаточно разными, чтобы оправдать новый вопрос, либо их ответы не соответствовали моим потребностям. Я ценю любые рекомендации по решению этой проблемы и понимания решения (й).

2

Решение

Задача ещё не решена.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector