2011-01-01 45 views
17

Tôi gặp một con trỏ đến các phương pháp tĩnh chungC++, chức năng con trỏ đến con trỏ mẫu chức năng

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

trỏ đến phương pháp tĩnh

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

khởi:

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

Tôi muốn chuyển con trỏ này thành con trỏ hàm mẫu tĩnh:

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

nơi:

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

Nhưng có lỗi biên dịch sau:

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

Nhờ sự giúp đỡ của bạn ...

Trả lời

13

Trong trường hợp thứ hai, getA không phải là một chức năng nữa nhưng chức năng mẫu và bạn không thể có con trỏ để hoạt động tạm thời muộn.

Những gì bạn có thể làm là có pfunction điểm đến một đặc biệt getA dụ (ví dụ: cho 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>; 

Nhưng tôi không nghĩ rằng có một cách để có được pfunction đến điểm trên bất kỳ trường hợp có thể có nào của getA.

11

mẫu là mẫu :) không phải là loại cụ thể và không thể được sử dụng làm thành viên. ví dụ. bạn không thể xác định loại sau đây:

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

vì có thể có thể chuyên về nhiều loại khác nhau. bạn có thể làm một cái gì đó như thế này:

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

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

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

đây A<int> là một mẫu chuyên và vì vậy đã chuyên viên

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

Mẫu của con trỏ hàm là bất hợp pháp trong C++. Hãy ở trong một lớp học, hoặc đơn giản là ở bên ngoài một lớp học.Bạn không thể viết này (thậm chí không bên ngoài một lớp):

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

Xem mẫu này: http://www.ideone.com/smh73

CáC++ Chuẩn C nói trong $ 14/1,

A template defines a family of classes or functions.

Xin lưu ý rằng nó không nói "Mẫu xác định một họ gồm lớp học, chức nănghoặc hàm con trỏ ". Vì vậy, những gì bạn đang cố gắng làm là, xác định "một họ của các con trỏ hàm" bằng cách sử dụng mẫu, cái mà không được phép.

Nhân viên chung từ thư viện Loki sẽ là giải pháp thanh lịch cho loại sự cố bạn đang gặp phải. :-)

2

Một điều bạn có thể làm là có một bản sao của hàm template thành viên trong file cpp và điểm đến mà ví dụ:

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 

tuy nhiên bạn có thể trỏ đến

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! 
Các vấn đề liên quan