8

以下代码给出编译错误:

template <typename T>
class Base
{
    public:
    void bar(){};
};

template <typename T>
class Derived : public Base<T>
{
    public:
    void foo() { bar(); }   //Error
};

int main()
{
    Derived *b = new Derived;
    b->foo();
}

错误

Line 12: error: there are no arguments to 'bar' that depend on a template parameter, so a declaration of 'bar' must be available

为什么会出现这个错误?

4

2 回答 2

14

该名称foo()不依赖于任何Derived模板参数 - 它是一个非依赖名称。foo()另一方面,找到的基类Base<T>确实依赖于一个Derived模板参数(即T),因此它是一个依赖基类。在查找非依赖名称时,C++ 不查找依赖基类。

要解决此问题,您需要将对bar()in的调用限定Derived::foo()this->bar()Base<T>::bar()

这个 C++ FAQ 项目很好地解释了它:见http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19

于 2012-04-25T08:28:20.110 回答
0

您提供的代码在您指示的行上没有构建错误。它在这里有一个:

Derived *b = new Derived;

应该是:

Derived<int> *b = new Derived<int>();

(或使用您想要的任何类型而不是 int。)

于 2012-04-25T08:31:26.093 回答