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

时间:2017-01-24 13:00:00

标签: c++ templates function-pointers

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

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

int main()
{


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


    return 0;
}

我上面有错误: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;
}
  • 有没有办法在范围内声明一个指向模板化函数的指针,就像在第一个代码中一样?

1 个答案:

答案 0 :(得分:10)

功能模板 功能函数指针只能分配给匹配签名的函数。

在此声明中:

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

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

假设您有一个函数指针Ktr,您只能将其分配给foo的实例化,如下所示:

void (*Ktr)(int);
Ktr = foo<int>;

在此声明中:

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

您声明了variable template (C++14)函数指针类型,将T类型的对象作为唯一参数。