关于C++:调用模板基类的模板函数

calling template function of template base class

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Where and why do I have to put the “template” and “typename” keywords?

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template<typename T>
class base
{
public:
    virtual ~base();

    template<typename F>
    void foo()
    {
        std::cout <<"base::foo<F>()" << std::endl;
    }
};

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        this->foo<int>(); // Compile error
    }
};

当运行时:

1
2
derived<bool> d;
d.bar();

我得到以下错误:

1
2
error: expected primary-expression before ‘int
error: expected ‘;’ before ‘int

我知道非依赖名称和两阶段查找。但是,当函数本身是一个模板函数(我的代码中的foo<>()函数)时,我尝试了所有的解决方法,但都失败了。


foo是从属名称,因此第一阶段查找假定它是变量,除非使用typenametemplate关键字指定其他名称。在这种情况下,您需要:

1
this->template foo<int>();

如果你想要所有血淋淋的细节,请看这个问题。


你应该这样做:

1
2
3
4
5
6
7
8
9
template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        base<T>::template foo<int>();
    }
};

下面是完整的可编译示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>

template<typename T>
class base
{
public:
    virtual ~base(){}

    template<typename F>
    void foo()
    {
        std::cout <<"base::foo<F>()" << std::endl;
    }
};

template<typename T>
class derived : public base<T>
{
public:

    void bar()
    {
        base<T>::template foo<int>(); // Compile error
    }
};

int main()
{
  derived< int > a;
  a.bar();
}