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 的定义中添加“使用”行不能解决此问题。例如

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