use*_*274 6 c++ inheritance templates 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;
}
Run Code Online (Sandbox Code Playgroud)
我有编译错误:在成员函数中void B<Derived>::foo():
template_inherit.cpp:12:错误:在此范围内未声明'useful_'.
这是为什么 ?任何好的修复?
Joh*_*itb 13
那是因为它usable_是一个非依赖名称,因此在解析模板时会查找它,而不是在实例化时查找(当基类已知时).
非限定名称查找将不会查找,并且从属基类中永远不会查找非相关名称.您可以usable_按如下方式使名称相关,这也将取消非限定名称查找
this->usable_ = false;
// equivalent to: A<B>::usable_ = false;
A< B<Derived> >::usable_ = false;
B::usable_ = false;
Run Code Online (Sandbox Code Playgroud)
所有这些都可行.或者,您可以使用using声明在派生类中声明名称
template <typename Derived>
struct B : A< B<Derived> >
{
using A< B<Derived> >::usable_;
void foo()
{
usable_ = false;
}
};
Run Code Online (Sandbox Code Playgroud)
请注意,C没有问题 - 它只会影响B.