如何在钻石继承中访问模板父基类的受保护成员变量

时间:2013-07-09 18:50:13

标签: c++ templates multiple-inheritance ambiguity name-lookup

我在更大的项目中有更复杂的以下代码版本。

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

这会产生相同的错误。我已经看到了类似的问题,但我觉得它们要么不同,要么保证一个新的问题,要么他们的答案似乎不符合我的需要。我很感激解决这个问题和理解解决方案的任何指导。

0 个答案:

没有答案