2011-01-01 23 views
17

IchC++, Funktionszeiger auf die Vorlage Funktionszeiger

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

der statischen Methode einen Zeiger auf die gemeinsame statische Verfahren mit zeigt

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

Initialisierung:

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

Ich möchte diesen Zeiger auf den statischen Template-Funktionszeiger konvertieren:

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

wo:

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

Aber es gibt den folgenden Compiler-Fehler:

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

Danke für Ihre Hilfe ...

Antwort

13

Im zweiten Fall ist getA keine Funktion mehr aber eine Funktion Vorlage, und Sie können keinen Zeiger auf Funktion Temp haben spät.

Was Sie tun können, ist pfunction Punkt zu einer insbesondere getA Instanz (zB: für 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>; 

Aber ich glaube nicht, dass es eine Möglichkeit, pfunction zu bekommen, ist Punkt auf beliebige mögliche Instanz von getA.

11

Vorlage ist eine Vorlage :) es ist kein konkreter Typ und kann nicht als Mitglied verwendet werden. z.B. Sie können nicht folgende Klasse definieren:

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

weil template <class T> std::vector<T> member; etwas ist, das möglicherweise auf viele verschiedene Arten spezialisiert werden kann. Sie können etwas tun:

template <class T> 
struct A 
{ 
static T (*pfunction)(); 
}; 

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

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

hier A<int> eine spezielle Vorlage ist und so Mitglied

6
template <class T> 
static T (*pfunction) (const Object <T> *, const Object <T> *); 

Vorlage von Funktionszeiger ist illegal in C++ hat sich darauf spezialisiert. Sei es in einer Klasse oder einfach außerhalb einer Klasse.Sie können dies nicht schreiben (nicht einmal außerhalb einer Klasse):

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

dieses Beispiel Siehe: http://www.ideone.com/smh73

der C++ Standard sagt in $ 14/1,

A template defines a family of classes or functions.

Bitte beachten Sie, dass es nicht sagen "Eine Vorlage definiert eine Familie von Klassen, Funktionenoder Funktionszeiger ". Sie versuchen also, eine "Familie von Funktionszeigern" mithilfe einer Vorlage zu definieren, die nicht erlaubt ist.

Generic Funktoren von Loki Bibliothek wäre eine elegante Lösung für die Art von Problem, das Sie haben. :-)

2

Eine Sache, die Sie tun können, ist in der CPP-Datei und Punkt eine Kopie der Vorlage Memberfunktion müssen, dass das heißt

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 

aber Sie

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! 
zeigen kann