C ++,模板,编译器错误[重复]

Posted

技术标签:

【中文标题】C ++,模板,编译器错误[重复]【英文标题】:C++, template, compiler error [duplicate] 【发布时间】:2010-12-27 16:26:36 【问题描述】:

可能重复:Why doesn't a derived template class have access to a base template class' identifiers?

以下程序的翻译

啊.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;

对比

#include "A.h"

【问题讨论】:

阅读comeaucomputing.com/techtalk/templates/#whythisarrow 重复Why doesn't a derived template class have access to a base template class' identifiers? 【参考方案1】:

A&lt;T&gt;::a 是一个依赖名,所以不能无条件使用。

想象一下在某处有一个A&lt;int&gt; 的特化:

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

编译器现在应该做什么?或者如果A&lt;int&gt;::a 是一个函数而不是一个变量呢?

确认您对a 的访问权限,因为您已经发现了this-&gt;a,一切都会正常进行。

【讨论】:

哦,我多么喜欢在没有任何解释的情况下被否决:( 你的答案是正确的。赞成制衡。

以上是关于C ++,模板,编译器错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++模板内部[重复]

C ++静态库中的模板方法[重复]

使用 ARM GCC 编译列表迭代器时的模板编译时错误

C语言 define 防止头文件重复包含

这是一个已知的 VC14 错误吗

pycharm 可以编译c代码吗?