0

私は.hファイルに次のクラスを持っています:

        class T;
    template < class Class, typename ReturnType,typename Parameter1 = int , typename Parameter2 = int, typename Parameter3 = int, typename Parameter4 = int >
    class EventHandlerAbstract
    {
    public:
        // constructors and destructors
        EventHandlerAbstract();
      //  ~EventHandlerAbstract();
        // data types
        typedef ReturnType (Class::*Method)(Parameter1, Parameter2, Parameter3, Parameter4);
      //  test,int Method 

    Method_ ;
        EventHandlerAbstract(Class* _class_instance, Method _method)
        {
            class_instance = _class_instance;
            method        = _method;
        }

ReturnType operator()(Parameter1 parameter1, Parameter2 parameter2=0, Parameter3 parameter3=0, Parameter4 parameter4=0)
{
    return (class_instance->*method)(parameter1, parameter2, parameter3, parameter4);
}

ReturnType execute(Parameter1 parameter1, Parameter2 parameter2, Parameter3 parameter3, Parameter4 parameter4)
{
    return operator()(parameter1, parameter2, parameter3, parameter4);
}

static void * makeFunctionPointer(Method _method, Class* _instance_class,Parameter1 parameter1 ,Parameter2 parameter2 , Parameter3 parameter3 , Parameter4 parameter4 );
Class*  class_instance;
Method  method;

static Class callbackType;
static pthread_t threadArray[1];

static std::vector<void *>  callbackList ;
static std::vector<std::string> eventList ;
static std::vector<std::pair <int, int> > eventRelationToCallbackList;
static std::vector<void * > runningCallbackList; // it should to free and thread should free it .
static std::vector<std::string > runningEventList; // it should to free and thread should free it .
}

次に、cpp ファイルに次の関数があります。

template <class Class,typename ReturnType,typename Parameter1 ,typename Parameter2 ,typename  Parameter3 ,typename Parameter4 >
void * EventHandlerAbstract<Class,ReturnType,Parameter1,Parameter2,Parameter3,Parameter4>::makeFunctionPointer(Method _method, Class* _instance_class,Parameter1 parameter1 = 0,Parameter2 parameter2 = 0, Parameter3 parameter3 = 0, Parameter4 parameter4 = 0)


{
    void * tempCallback;
    ///add_callback
    //
    typedef  typeof(_instance_class) _Class ;
    typedef EventHandlerAbstract<_Class, ReturnType, Parameter1, Parameter2, Parameter3, Parameter4>  Callback_;
//      _Class _instance = _Class();
    Callback_ classPointer(&_instance_class, &_method);
    EventHandlerAbstract<test,int>::callbackType = classPointer ;
    tempCallback = (static_cast<void*>(&classPointer));
    //(*static_cast< _callback* >(tempCallback))(1,2,3,4); //running a func, a good test
    return tempCallback;
}

しかし、次の呼び出しなどのメイン関数を呼び出すと、エラーが発生します。私の呼び出し:

cout << (void *)(EventHandlerAbstract<T,T>::makeFunctionPointer(&test::called,ptr,1, 2, 5, 9)) << endl;

また :

cout << (void *)(EventHandlerAbstract<test,bool>::makeFunctionPointer(&test::called,ptr,1, 2, 5, 9)) << endl;

私のエラー:

 error: no matching function for call to ‘EventHandlerAbstract<T, T>::makeFunctionPointer(int (test::*)(int, int, int, int), test&, int, int, int, int)’

また

 error: no matching function for call to ‘EventHandlerAbstract<test, bool>::makeFunctionPointer(int (test::*)(int, int, int, int), test&, int, int, int, int)’

私は混乱しています。ネット上のテンプレートに関する FAQ を読みましたが、私のエラーを理解できません。私を助けてくれたら、あなたは私を幸せにするでしょう...

4

1 に答える 1

0

テンプレート関数の定義は、他の.cppsのコンパイラでは使用できないため、通常の.cppには表示できません。クラス定義を.hと.cppに分けるのは良いことなので、1つの解決策は#include "myclass.cpp".hファイルの最後に置くことです。

于 2012-07-21T07:41:15.893 に答える