考虑以下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_' 范围。
为什么?有什么好的解决办法吗?
答案 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
。