调用模板基类的模板函数

Dan*_* K. 16 c++ templates dependent-name

可能重复:
我必须在何处以及为何要使用"template"和"typename"关键字?

这是代码:

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
    } 
};
Run Code Online (Sandbox Code Playgroud)

而且,在运行时:

derived<bool> d;
d.bar();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: expected primary-expression before ‘int’
error: expected ‘;’ before ‘int’
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*our 28

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

this->template foo<int>();
Run Code Online (Sandbox Code Playgroud)

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


BЈо*_*вић 11

你应该这样做:

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        base<T>::template foo<int>();
    } 
};
Run Code Online (Sandbox Code Playgroud)

这是一个完整的可编辑示例:

#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();
}
Run Code Online (Sandbox Code Playgroud)