dim*_*mba 61 c++ inheritance templates typedef name-lookup
我正在尝试定义基类,它只包含typedef.
template<typename T>
class A
{
public:
typedef std::vector<T> Vec_t;
};
template<typename T>
class B : public A<T>
{
private:
Vec_t v; // fails - Vec_t is not recognized
};
Run Code Online (Sandbox Code Playgroud)
BI中为什么会收到Vec_t无法识别的错误,我需要明确写出来?
typename A<T>::Vec_t v;
Run Code Online (Sandbox Code Playgroud)
Xin*_*nus 37
在模板的情况下,存在称为依赖和非依赖名称的东西.
如果name依赖于模板参数T,其依赖名称和其他不依赖于参数T的名称是独立名称.
这是规则:在查找非依赖名称(如Vec_t)时,编译器不会查找依赖的基类(如A).结果,编译器不知道它们甚至存在,更不用说类型了.
编译器不能假设它Vec_t是一个类型,直到它知道,T因为有一个潜在的专业化,A<T>其中A<T>:: Vec_ta是一个数据成员
所以解决方案是使用typename
typename A<T>::Vec_t v; ? good
Run Code Online (Sandbox Code Playgroud)
我建议你浏览这个https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-types.
旧(破碎)链接:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18
为了完整起见,以下是您可以减轻这种麻烦的方法之一:
using declaration:template<typename T>
class A
{
public:
typedef std::vector<T> Vec_t;
};
template<typename T>
class B : public A<T>
{
public:
using typename A<T>::Vec_t;
// .........
private:
Vec_t v;
};
Run Code Online (Sandbox Code Playgroud)
如果typedef在派生类中对继承项的提及不止一个,它可能会很有用。另外,您不需要typename每次都添加此内容。