C ++,模板,编译器错误

时间:2010-12-27 16:26:36

标签: c++ templates compilation

  

可能重复:
  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"

1 个答案:

答案 0 :(得分:0)

A<T>::a是一个从属名称,因此您不能使用它不合格。

想象一下A<int>某处的专业化:

template<> class A<int> { /* no a defined */ };

编译器现在应该做什么?或者,如果A<int>::a是函数而不是变量,该怎么办?

有资格访问a,因为您已经发现了this->a,并且一切正常。