【问题标题】:Qualified access needed when inheriting from template [duplicate]从模板继承时需要合格的访问权限[重复]
【发布时间】:2013-03-27 19:53:54
【问题描述】:

在这种情况下,为什么我不能访问B1 情况下不合格的基类成员x?在我看来并不模棱两可……

template<class T>
struct A { T x; };

template<class T>
struct B1 : A<T> { T f() { return A<T>::x; } };

struct B2 : A<int> { int f() { return x; } };

【问题讨论】:

  • 之前也不知道using A&lt;T&gt;::x

标签: c++ templates


【解决方案1】:

因为x不依赖,所以会在 定义模板的上下文。在这种情况下, 编译器对T一无所知,并且无法查看依赖库 类。例如,它怎么可能知道A&lt;T&gt; 的任何内容,却不知道T 是什么。 (例如,A 的特化可能是完全不同的成员。)

【讨论】:

  • 这不能解释为什么编译器看不到x。基类不是T,而是A&lt;T&gt;,而A&lt;T&gt;的定义在定义B1时就已经可用。我知道这种语言不是这样工作的,但是当我读到它时,问题是“为什么不这样?”
  • 实际上,我认为这里的问题更多是关于为什么它看不到x,因为我们知道基本类型是A&lt;int&gt;。这里根本没有模板参数。
  • 基类依赖于T。编译器在知道T 是什么之前无法看到它。 (例如,如果A&lt;T&gt; 明确专门用于某些类型怎么办?)
  • @sftrabbit 当我们知道基类是A&lt;int&gt;,就可以看到x,就没有问题了。当只知道它是A&lt;T&gt; 时,编译器在知道T 是什么之前无法知道A&lt;T&gt; 包含什么。
  • @pascal 当你专注于A&lt;int&gt; 时,你几乎可以做任何你想做的事情。如果您想要一个示例,请查看标准:std::allocator&lt;void&gt; 的成员不到通用 std::allocator&lt;T&gt; 的一半。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2021-01-26
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多