大規模なプロジェクトに、次のコードのより複雑なバージョンがあります。
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 の定義に「using」行を追加してもこの問題が解決されない理由がわかりません。例えば
class GChild1: public virtual Child1, public virtual Child2, public virtual Base<std::string>{
private:
using Base<std::string>::var;
public:
/* Same Code */
}
これにより、同じエラーが発生します。似たような質問がされたのを見たことがありますが、新しい質問をするのに十分なほど異なっているか、回答が私のニーズに合わないと感じました。この問題を解決し、解決策を理解するためのガイダンスに感謝します。