Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用模板基类的模板函数_C++_Templates_Dependent Name - Fatal编程技术网

C++ 调用模板基类的模板函数

C++ 调用模板基类的模板函数,c++,templates,dependent-name,C++,Templates,Dependent Name,可能重复: 代码如下: template<typename T> class base { public: virtual ~base(); template<typename F> void foo() { std::cout << "base::foo<F>()" << std::endl; } }; template<typename T> class de

可能重复:

代码如下:

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

我知道。但是,当函数本身是一个模板函数时(
foo()
函数在我的代码中),我尝试了所有的变通方法,但都失败了。

您应该这样做:

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        base<T>::template foo<int>();
    } 
};
模板
派生类:公共基
{
公众:
空条()
{
base::template foo();
} 
};

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

#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();
}
#包括
模板
阶级基础
{
公众:
虚拟~base(){}
模板
void foo()
{

std::cout
foo
是一个依赖名称,因此第一阶段查找假定它是一个变量,除非使用
typename
template
关键字进行其他指定。在这种情况下,您需要:

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

看看你是否想要所有血淋淋的细节。

谢谢!今天真的救了我一命
#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();
}
this->template foo<int>();