这个问题已经在这里有了答案:




已关闭10年。






以下代码给了我编译错误。怎么了?

struct Base {
   int amount;
};

template<class T> struct D1 : public Base {
};

template<class T>
struct D2 : D1<T> {
  void foo() { amount=amount*2; /* I am trying to access base class data member */ };
};

int main() {
  D2<int> data;
};


test.cpp: In member function 'void D2<T>::foo()':
test.cpp:11: error: 'amount' was not declared in this scope

如何解决这个问题?

谢谢

最佳答案

这里的问题与如何在从模板基类继承的模板类中查找名称有关。它背后的实际规则很神秘,我不知道这些规则是什么。我通常必须查阅引用资料,以准确了解为什么它不起作用。

解决此问题的方法是使用this->明确为要访问的成员添加前缀:

void foo() {
    this->amount = this->amount * 2; // Or: this->amount *= 2;
}

这为编译器提供了有关amount名称来自何处的明确提示,并应解决编译器错误。

如果有人想对发生此错误的原因进行更详细的描述,我希望看到一个很好的解释。

关于C++模板类和继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4919322/

10-15 17:27