我可以在范围内创建指向模板化函数的指针吗?

Lee*_*ong 2 c++ templates function-pointers

我想创建一个指向模板化函数的指针:

template <class T>
void foo(T x){}

int main()
{


template <class T>
void (*ptr)(T);


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我上面有错误: error C2951: template declarations are only permitted at global or namespace scope

所以我可以通过在全局范围内声明指向模板化函数的方法来修复它并且它可以正常工作:

template <class T>
void foo(T x){ cout << "foo()" << endl;}

template <class T>
void (*ptr)(T);


int main()
{

    ptr = foo;
    (*ptr)(7);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 有没有办法在像第一个代码中的范围内声明一个指向模板化函数的指针?

Whi*_*TiM 10

一个函数模板不是一个函数.和函数指针只能分配给匹配签名的功能.

在这个声明中:

template <class T>
void foo(T x){ cout << "foo()" << endl;}
Run Code Online (Sandbox Code Playgroud)

foo是一个功能模板.直到在生成函数之前实例化它.因此,您只能获得指向实例化的函数指针foo.


假设你有一个函数指针说Ktr,你只能将它分配给如下的实例化foo:

void (*Ktr)(int);
Ktr = foo<int>;
Run Code Online (Sandbox Code Playgroud)

在这个声明中:

template <class T>
void (*ptr)(T);
Run Code Online (Sandbox Code Playgroud)

您声明了一个函数指针类型的变量模板(C++ 14),它将类型的对象T作为唯一参数.