18

可能重复:
我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

这是代码:

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
    } 
};

并且,运行时:

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

我收到以下错误:

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

我知道non-dependent names 和 2-phase look-ups。但是,当函数本身是模板函数(foo<>()我的代码中的函数)时,我尝试了所有变通方法但都失败了。

4

2 回答 2

32

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

this->template foo<int>();

如果您想要所有血淋淋的细节,请参阅这个问题。

于 2012-02-15T08:15:28.033 回答
12

你应该这样做:

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        base<T>::template foo<int>();
    } 
};

这是完整的可编译示例:

#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();
}
于 2012-02-15T08:15:16.707 回答