关于模板类的继承及其用法的问题

时间:2019-05-29 14:50:14

标签: c++

我在这里有这个小样本课程:

#include <iostream>

class A {
protected:
    void method_a() {
        std::cout << "Hello World" << std::endl;
    }
};

template <class T>
class B : public A {
public:
    void method_b() {
        method_a();
    }
};

template <class T>
class C : public B<T> {
public:
    void method_c() {
        method_a(); // the line the question is about
    }
};

int main() {

    C<int> c;
    c.method_c();
}

如果我使用g ++进行编译,则会出现此错误:

$ tmp g++ -std=c++17 test.cpp
test.cpp: In member function ‘void C<T>::method_c()’:
test.cpp:22:9: error: there are no arguments to ‘method_a’ that depend on a template parameter, so a declaration of ‘method_a’ must be available [-fpermissive]
         method_a();
         ^~~~~~~~
test.cpp:22:9: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)

但是,如果我将method_c更改为以下内容,它将起作用:

void method_c() {
    this->method_a();
}

我在这里无法理解编译器的行为。为什么需要在此处添加this?这是c ++并多次继承的一般情况吗?我不记得以前遇到过这个问题。

旁注: 我实际上在一个更复杂的示例中遇到了这个问题,但为简单起见,我试图找到一个最低限度的工作示例

0 个答案:

没有答案