2

大規模なプロジェクトに、次のコードのより複雑なバージョンがあります。

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 */
}

これにより、同じエラーが発生します。似たような質問がされたのを見たことがありますが、新しい質問をするのに十分なほど異なっているか、回答が私のニーズに合わないと感じました。この問題を解決し、解決策を理解するためのガイダンスに感謝します。

4

0 に答える 0