2011-10-17 45 views
5

Tôi đã chống đầu của tôi chống lại vấn đề này trong một nhiệm vụ tôi đã được làm việc trên, và dường như không thể làm cho nó hoạt động cả. Tôi đã viết một bài kiểm tra nhỏ để chứng minh những gì tôi đang cố gắng làm, và hy vọng ai đó có thể giải thích những gì tôi cần làm.Hàm con trỏ tới hàm thành viên của lớp mẫu? (C++)

//Tester class 
#include <iostream> 
using namespace std; 

template <typename T> 
class Tester 
{ 
    typedef void (Tester<T>::*FcnPtr)(T); 

private: 
    T data; 
    void displayThrice(T); 
    void doFcn(FcnPtr fcn); 

public: 
    Tester(T item = 3); 
    void function(); 
}; 

template <typename T> 
inline Tester<T>::Tester(T item) 
    : data(item) 
{} 

template <typename T> 
inline void Tester<T>::doFcn(FcnPtr fcn) 
{ 
    //fcn should be a pointer to displayThrice, which is then called with the class data 
    fcn(this->data); 
} 

template <typename T> 
inline void Tester<T>::function() 
{ 
    //call doFcn with a function pointer to displayThrice() 
    this->doFcn(&Tester<T>::displayThrice); 
} 

template <typename T> 
inline void Tester<T>::displayThrice(T item) 
{ 
    cout << item << endl; 
    cout << item << endl; 
    cout << item << endl; 
} 

-Và đây là chính:

#include <iostream> 
#include "Tester.h" 
using namespace std; 

int main() 
{ 
    Tester<int> test; 
    test.function(); 

    cin.get(); 
    return 0; 
} 

-Và cuối cùng, lỗi biên dịch của tôi (VS2010)

c:\users\name\documents\visual studio 2010\projects\example\example\tester.h(28): error C2064: term does not evaluate to a function taking 1 arguments 
1>   c:\users\name\documents\visual studio 2010\projects\example\example\tester.h(26) : while compiling class template member function 'void Tester<T>::doFcn(void (__thiscall Tester<T>::*)(T))' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   c:\users\name\documents\visual studio 2010\projects\example\example\tester.h(21) : while compiling class template member function 'Tester<T>::Tester(T)' 
1>   with 
1>   [ 
1>    T=int 
1>   ] 
1>   c:\users\name\documents\visual studio 2010\projects\example\example\example.cpp(7) : see reference to class template instantiation 'Tester<T>' being compiled 
1>   with 
1>   [ 
1>    T=int 
1>   ] 

Hy vọng rằng, ý kiến ​​của tôi trong lớp Tester sẽ cho bạn biết những gì tôi m cố gắng làm. Cảm ơn bạn đã dành thời gian để xem xét điều này!

+0

Hãy chắc chắn để thêm thẻ bài tập về nhà nếu thích hợp. Ngoài ra, hãy xem 'boost :: bind', cụ thể là 'boost :: mem_fn'. –

Trả lời

10

Bạn không gọi con trỏ hàm thành viên một cách chính xác; nó yêu cầu sử dụng một toán tử đặc biệt gọi là pointer-to-member operator.

template <typename T> 
inline void Tester<T>::doFcn(FcnPtr fcn) 
{ 
    (this->*fcn)(this->data); 
    // ^^^ 
} 
+0

Hầu như chính xác, nhưng thiếu một cặp dấu ngoặc vuông. – UncleBens

+0

Oy, thật vậy. Cảm ơn bạn! –

+0

Cảm ơn bạn rất nhiều! – TNTisCOOL

1

Để gọi một hàm thành viên thông qua một con trỏ-to-viên-chức năng cộng thêm con trỏ Ví dụ, bạn cần ->* cú pháp, minding điều hành ưu tiên:

(this->*fcn)(data); 
+0

Nó hoạt động! Cảm ơn bạn rất nhiều. Cố gắng tìm ra tất cả những điều đó là một cơn ác mộng đầy cú pháp xấu xí. – TNTisCOOL

1

Bạn cần phải thêm một cách rõ ràng đối tượng bạn thông điệp:

(*this.*fcn)(this->data); // << '*this' in this case 

cũng thấy C++ FAQ

+0

Nó hoạt động! Cảm ơn bạn! – TNTisCOOL

Các vấn đề liên quan