首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++,指向模板函数指针的函数指针

C++,指向模板函数指针的函数指针
EN

Stack Overflow用户
提问于 2011-01-01 19:43:24
回答 4查看 63.1K关注 0票数 27

我有一个指向通用静态方法的指针

代码语言:javascript
运行
复制
class MyClass
{
  private:
    static double ( *pfunction ) ( const Object *, const Object *);
    ...
};

指向静态方法

代码语言:javascript
运行
复制
 class SomeClass
 {
  public:
    static double getA ( const Object *o1, const Object *o2);
    ...
 };

初始化:

代码语言:javascript
运行
复制
double ( *MyClass::pfunction ) ( const Object *o1, const Object *o2 )  = &SomeClass::getA;

我想将此指针转换为静态模板函数指针:

代码语言:javascript
运行
复制
template <class T>
static T ( *pfunction ) ( const Object <T> *, const Object <T> *); //Compile error

其中:

代码语言:javascript
运行
复制
 class SomeClass
 {
  public:
    template <class T>
    static double getA ( const Object <T> *o1, const Object <T> *o2);
    ...
 };

但是有以下编译错误:

代码语言:javascript
运行
复制
error: template declaration of : T (* pfunction )(const Object <T> *o1, const Object <T> *o2)

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

发布于 2011-01-01 19:55:02

在第二种情况下,getA不再是一个函数,而是一个函数模板,您不能有指向函数模板的指针。

你能做的就是让pfunction指向一个特定的getA实例(例如:对于T = int):

代码语言:javascript
运行
复制
class MyClass
{
    static double (*pfunction)(const Object<int> *, const Object<int> *);
};

double (*MyClass::pfunction)(const Object<int> *o1, const Object<int> *o2)  = &SomeClass::getA<int>;

但我不认为有一种方法可以让pfunction指向任何可能的getA实例。

票数 22
EN

Stack Overflow用户

发布于 2011-01-01 21:17:13

template是一个模板 :)它不是一个具体的类型,不能用作成员。例如,您不能定义以下类:

代码语言:javascript
运行
复制
class A
{
    template <class T> std::vector<T> member;
}

因为template <class T> std::vector<T> member;是潜在地可以专用于许多不同类型的东西。你可以这样做:

代码语言:javascript
运行
复制
template <class T>
struct A
{
 static T (*pfunction)();
};

struct B
{
 template <class T>
 static T getT();
};

int (*A<int>::pfunction)() = &B::getT<int>;

这里的A<int>是一个专门的模板,因此也有专门的成员

票数 14
EN

Stack Overflow用户

发布于 2011-01-01 21:20:10

代码语言:javascript
运行
复制
template <class T>
static T ( *pfunction ) ( const Object <T> *, const Object <T> *);

函数指针的模板在C++中非法。它可以在类内,也可以简单地在类外。您不能这样写(甚至不能在类之外):

代码语言:javascript
运行
复制
template <class X>
void (*PtrToFunction) (X);

请参阅此示例:http://www.ideone.com/smh73

C++标准说是$14/1,

模板定义了一系列函数

请注意,它并没有说"A template defines a family of classes,function or function pointers“。所以你要做的是,使用模板定义“一系列函数指针”,这是不允许的。

Loki库中的泛型函数库可以很好地解决您遇到的这类问题。:-)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4573941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档