模板继承和基本成员变量

Jiř*_*ner 4 c++ inheritance templates base-class

尝试使用模板继承时,我遇到了一个奇怪的错误.这是我的代码:

template <class T> class A {
public:
    int a {2};
    A(){};
};

template <class T> class B : public A<T> {
    public:
    B(): A<T>() {};
    void test(){    std::cout << "testing... " << a << std::endl;   };
};
Run Code Online (Sandbox Code Playgroud)

这是错误:

error: use of undeclared identifier 'a'; did you mean 'std::uniform_int_distribution<long>::a'?
    void test(){    std::cout << "testing... " << a << std::endl;   }
Run Code Online (Sandbox Code Playgroud)

如果它可能影响我使用这些标志的东西:

-Wall -g -std=c++11
Run Code Online (Sandbox Code Playgroud)

我真的不知道出了什么问题,因为与没有模板的纯类相同的代码工作正常.

son*_*yao 8

我真的不知道出了什么问题,因为与没有模板的纯类相同的代码工作正常.

这是因为基类(类模板A)不是非依赖的基类,在不知道模板参数的情况下无法确定其类型.并且a是一个非独立的名称.在从属基类中不查找非依赖名称.

要更正代码,您可以使名称a相关,只能在实例化时查找相关名称,此时必须探索确切的基本特征并且将是已知的.

你可以

void test() { std::cout << "testing... " << this->a << std::endl; };
Run Code Online (Sandbox Code Playgroud)

要么

void test() { std::cout << "testing... " << A<T>::a << std::endl; };
Run Code Online (Sandbox Code Playgroud)

要么

void test() { 
    using A<T>::a;
    std::cout << "testing... " << a << std::endl; 
};
Run Code Online (Sandbox Code Playgroud)