基本模板类数据成员在派生模板类中不可见?

时间:2010-11-17 23:05:25

标签: c++ templates inheritance base-class

考虑以下C ++代码,

template <typename Derived>
struct A
{
    bool usable_;
};

template <typename Derived>
struct B : A< B<Derived> >
{
    void foo()
    {
        usable_ = false;
    }
};

struct C : B<C>
{
    void foo()
    {
        usable_ = true;
    }
};

int main()
{
    C c;
}

我遇到了编译错误:在成员函数void B<Derived>::foo()中:

  

template_inherit.cpp:12:错误:此处未声明'useful_'   范围。

为什么?有什么好的解决办法吗?

1 个答案:

答案 0 :(得分:13)

那是因为usable_是一个非依赖名称,因此在解析模板时会查找它,而不是在实例化时查找(当基类已知时)。

非限定名称查找不会查找,并且从属基类中永远不会查找非相关名称。您可以将名称usable_依赖,如下所示,这也将取消非限定名称查找

this->usable_ = false;

// equivalent to: A<B>::usable_ = false;
A< B<Derived> >::usable_ = false;

B::usable_ = false;

所有这些都有效。或者,您可以使用using-declaration

在派生类中声明名称
template <typename Derived>
struct B : A< B<Derived> >
{
    using A< B<Derived> >::usable_;

    void foo()
    {
        usable_ = false;
    }
};

请注意,C中没有任何问题 - 只会影响B