У меня есть более сложная версия следующего кода в большом проекте.
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 */
}
Это приводит к той же ошибке. Я видел похожие вопросы, задаваемые, но я чувствовал, что они либо были достаточно разными, чтобы оправдать новый вопрос, либо их ответы не соответствовали моим потребностям. Я ценю любые рекомендации по решению этой проблемы и понимания решения (й).
Задача ещё не решена.
Других решений пока нет …