我在A
中定义了一个模板化基类B
和模板化派生类headers.h
,实现转到source.cpp
以下代码无法编译,因为x
不在B
的范围内。问题是我在做什么错?我发现,如果未将A
用作模板,则代码可以正常编译(带有相关更改)。
// headers.h
template <typename T>
class A
{
public:
T x;
}
template <typename T>
class B : public A<T>
{
void foo(); // do something with x
}
// source.cpp
#include headers.h
template <typename T>
void B<T>::foo() {} // do something with x
// explicit instantiation
template class B<double>;
答案 0 :(得分:2)
以下代码无法编译,因为
x
不在B
范围内
A<T>
是类模板B
的基类:
template<typename T>
class B: public A<T> {
// ...
};
尽管x
中的成员A<T>
实际上是在B
中继承的,但在B
中却找不到它,因为名称x
在{ {1}}不在其基类B
中查找。原因是默认情况下,在不依赖模板参数的基类中不执行名称查找(基类A<T>
依赖于A<T>
的模板参数,即B
)。要在T
的{{1}}中查找名称x
,您需要将其表示为A<T>
或B
。
我发现,如果未将
this->x
用作模板,则代码可以正常编译
在这种情况下,基类不依赖于模板参数,因此在基类中执行A<T>::x
的查找,甚至从A
中找到成员x
如果您不将其表示为x
或B
。