我在这里有这个小样本课程:
#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 ++并多次继承的一般情况吗?我不记得以前遇到过这个问题。
旁注: 我实际上在一个更复杂的示例中遇到了这个问题,但为简单起见,我试图找到一个最低限度的工作示例