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

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;
}
  • 是否可以像第一个代码中那样在范围内声明指向模板化函数的指针?
  • 最佳答案

    函数模板是而不是是函数。并且功能指针只能分配给匹配签名的功能。

    在此声明中:

    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类型的对象作为唯一参数。

    10-04 22:16
    查看更多