无法访问模板基类'没有显式范围的静态成员

时间:2017-04-11 09:41:42

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

Demo

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

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

一个试图访问foo的临时派生类A.

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

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

如果第三方/主管只通过模板说TClass知道A或B,那么他们如何在不知道内部的情况下访问TClass::foo

1 个答案:

答案 0 :(得分:1)

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

正如你所说,使用A<T...>::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';
}