【问题标题】:Unable to access template base class' static member without explicit scope无法在没有明确范围的情况下访问模板基类的静态成员
【发布时间】:2017-04-11 09:41:41
【问题描述】:

Demo

具有静态成员 foo 的模板类。

template <typename... T>
struct A {
    static constexpr bool foo = true;
};

A 的模板派生类试图访问 foo。

template <typename... T>
struct B  : A<T...> {
    void yo() {
        std::cout << foo << '\n';
    }
};

这失败了。谁能解释一下为什么??我可以通过直接访问它来解决它,比如A&lt;T...&gt;::foo,但是如果 B 有它自己的静态变量隐藏 foo 怎么办?

如果第三方/主要人员仅通过模板(例如TClass)知道 A 或 B,他们如何在不了解内部情况的情况下访问 TClass::foo

【问题讨论】:

  • 照原样,foo 是一个非依赖名称,您也可以使用 this-&gt;foo 使其依赖。

标签: c++ c++11 templates static


【解决方案1】:

请注意foo 是一个非依赖名称,但A 是一个依赖于模板参数T... 的依赖基类。标准 C++ 表示不会在依赖基类中查找非依赖名称。

正如您所说,使用 A&lt;T...&gt;::foo 可以正常工作,因为它是一个从属名称。同样,B::foo 也可以正常工作。

你可以

void yo() {
    std::cout << A<T...>::foo << '\n';
    std::cout << B::foo << '\n';
    std::cout << this->foo << '\n';
}

using A<T...>::foo;
void yo() {
    std::cout << foo << '\n';
}

【讨论】:

  • std::cout &lt;&lt; B::foo &lt;&lt; '\n'; 谢谢。因此,即使 B::foo 隐藏了 A::foo,从外部访问 foo 也是可以的,我总会得到正确的 foo。
猜你喜欢
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多