C ++, указатель функции на указатель на функцию шаблона - PullRequest
21 голосов
/ 01 января 2011

У меня есть указатель на общий статический метод

class MyClass
{
  private:
    static double ( *pfunction ) ( const Object *, const Object *);
    ...
};

, указывающий на статический метод

 class SomeClass
 {
  public:
    static double getA ( const Object *o1, const Object *o2);
    ...
 };

Инициализация:

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

Я хотел быпреобразовать этот указатель в статический указатель на функцию шаблона:

template <class T>
static T ( *pfunction ) ( const Object <T> *, const Object <T> *); //Compile error

где:

 class SomeClass
 {
  public:
    template <class T>
    static double getA ( const Object <T> *o1, const Object <T> *o2);
    ...
 };

Но есть следующая ошибка компиляции:

error: template declaration of : T (* pfunction )(const Object <T> *o1, const Object <T> *o2)

Спасибо заваша помощь ...

Ответы [ 4 ]

15 голосов
/ 01 января 2011

Во втором случае getA больше не функция, а функция шаблон , и у вас не может быть указателя на шаблон функции.

Что вы можете сделать, этоpfunction указывают на конкретный getA экземпляр (т. е. для T = int):

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.

12 голосов
/ 01 января 2011
Шаблон

является шаблоном :), он не является конкретным типом и не может использоваться в качестве члена. например Вы не можете определить следующий класс:

class A
{
    template <class T> std::vector<T> member;
}

потому что template <class T> std::vector<T> member; - это то, что потенциально может быть специализировано для множества различных типов. Вы можете сделать что-то вроде этого:

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> является специализированным шаблоном и имеет специализированный член

8 голосов
/ 01 января 2011
template <class T>
static T ( *pfunction ) ( const Object <T> *, const Object <T> *);

Шаблон указателя на функцию недопустим в C ++. Будь то внутри класса или просто вне класса. Вы не можете написать это (даже вне класса):

template <class X>
void (*PtrToFunction) (X);

См. Этот образец: http://www.ideone.com/smh73

Стандарт C ++ говорит в $ 14/1,

Шаблон определяет семейство классов или функции .

Обратите внимание, что в нем НЕ сказано "Шаблон определяет семейство классов , функций или указателей на функции ". Итак, вы пытаетесь определить «семейство указателей на функции» с помощью шаблона, что недопустимо.

Универсальные функторы из библиотеки Loki были бы элегантным решением проблемы, с которой вы столкнулись. : -)

2 голосов
/ 12 июня 2012

Одна вещь, которую вы можете сделать - это скопировать функцию-член шаблона в файле cpp и указать на нее, то есть

template <+typename ElementType>
int PQueueHeap<ElementType>::compareFunction(ElementType First,ElementType Second)
{   
    if (First>Second) return 1; else if (First==Second) return 0; else return -1;
}

// you cannot point to above 

, однако вы можете указать на

template <+typename ElementType>

int compareFunction(ElementType First,ElementType Second)
{

if (First>Second) return 1; else if (First==Second) return 0; else return -1;
} // No error and it works! 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...