可能重复:
Why doesn't a derived template class have access to a base template class' identifiers?
翻译以下程序
A.H
#ifndef A_H
#define A_H
template <class T>
class A
{
protected :
T a;
public:
A(): a(0) {}
};
#endif
B.h
#ifndef B_H
#define B_H
template <class T>
class A;
template <class T>
class B: public A <T>
{
protected:
T b;
public:
B() : A<T>(), b(0) {}
void test () { b = 2 * a;} //a was not declared in this scope
};
#endif
导致错误:“a未在此范围内声明”。 (Netbeans 6.9.1)。
但是建筑
void test () { b = 2 * this->a;}
是对的......问题出在哪里?
使用前向声明或文件包含指令是否更好?
B.h
template <class T>
class A;
VS
#include "A.h"
答案 0 :(得分:0)
A<T>::a
是一个从属名称,因此您不能使用它不合格。
想象一下A<int>
某处的专业化:
template<> class A<int> { /* no a defined */ };
编译器现在应该做什么?或者,如果A<int>::a
是函数而不是变量,该怎么办?
有资格访问a
,因为您已经发现了this->a
,并且一切正常。