2011-01-01 5 views
17

Я имею указатель на общий статический методC++, функция указатель на функцию шаблона указателя

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

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

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

Initialization:

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) 

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

ответ

13

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

Что вы можете сделать, это 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.

11

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

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

6
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,

A template defines a family of classes or functions.

Пожалуйста, обратите внимание, что это не «шаблон» определяет семейство классы, функцииили указатели функций ". Итак, что вы пытаетесь сделать, это определение «семейства указателей функций» с использованием шаблона, который не разрешен.

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

2

Одна вещь, которую вы можете сделать, это есть копия функции члена шаблона в файле 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! 
Смежные вопросы