调用模板基类的模板函数

时间:2012-02-15 08:11:26

标签: c++ templates dependent-name

  

可能重复:
  Where and why do I have to put the “template” and “typename” keywords?

以下是代码:

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 and 2-phase look-ups。但是,当函数本身是模板函数(我的代码中的foo<>()函数)时,我尝试了所有变通方法只是失败了。

2 个答案:

答案 0 :(得分:25)

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

this->template foo<int>();

如果您需要所有血腥的详细信息,请参阅this question

答案 1 :(得分:10)

你应该这样做:

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