最近我在看chrome 的callback源码, 就照着写了如下一个类模板, 这个类模板接受 函数指针为模板参数,但是怎么也比编译不过,以下是源码, 请问院子里的高人们,我哪里写错了
// callback.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
template <typename R, typename A1, typename A2> struct T_Funct;
template <typename R, typename A1, typename A2> struct T_Funct<R (__stdcall *)(A1,A2), A1, A2>{
typedef R (Run)(A1,A2);
R (__stdcall *function_)(A1, A2);
explicit T_Funct(R(__stdcall *function)(A1,A2), A1 a1, A2 a2):function_(function),a1_(a1),a2_(a2){}
R operator()(){
return function_();
}
};
int show_int(int , int ){
return printf("print_int is invoked...\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
typedef int (*p_fun_int)(int, int );
p_fun_int fun_int;
fun_int = show_int;
T_Funct<int , int , int > t_funct(fun_int, 1,2);
return 0;
}
编译错误如下:
1>------ Build started: Project: callback, Configuration: Debug Win32 ------
1>Compiling...
1>callback.cpp
1>e:\code\template\callback\callback\callback.cpp(26) : error C2079: 't_funct' uses undefined struct 'T_Funct<R,A1,A2>'
1> with
1> [
1> R=int,
1> A1=int,
1> A2=int
1> ]
1>e:\code\template\callback\callback\callback.cpp(26) : error C2078: too many initializers
1>Build log was saved at "file://e:\code\template\callback\callback\Debug\BuildLog.htm"
1>callback - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
在高人的指教下:
我完成了对 给模板参数传普通函数指针, 给模板参数 传成员函数指针的问题:
#include "stdafx.h" struct true_type{}; template <typename R> struct T_Funct; template <typename R, typename A1, typename A2> struct T_Funct<R (*)(A1,A2)>{ typedef R (Runable)(A1,A2); Runable* function_; A1 a1_; A2 a2_; explicit T_Funct(Runable function, A1 a1, A2 a2):function_(function),a1_(a1),a2_(a2){} R Run(){ return function_(a1_,a2_); } R operator()(){ return function_(a1_,a2_); } }; template <typename R, typename T, typename A1, typename A2>struct T_Funct<R (T::*)(A1, A2) >{ typedef true_type IsMethod; R (T::*function_)(A1,A2); explicit T_Funct(R (T::*method)( A1, A2)):function_(method){} R Run(T* object, A1 a1, A2 a2){ return (object->*function_)(a1,a2); } }; template <typename R, typename T, typename A1, typename A2>struct T_Funct<R (T::*)(A1, A2)const >{ typedef true_type IsMethod; R (T::*function_)(A1,A2)const; explicit T_Funct(R (T::*method)( A1, A2)const):function_(method){} R Run(T* object, A1 a1, A2 a2){ return (object->*function_)(a1,a2); } }; template <typename R, typename T, typename A1, typename A2>struct T_Funct<const R (T::*)(A1, A2) >{ typedef true_type IsMethod; const R (T::*function_)(A1,A2); explicit T_Funct(const R (T::*method)( A1, A2)):function_(method){} R Run(T* object, A1 a1, A2 a2){ return (object->*function_)(a1,a2); } }; template <typename R, typename T, typename A1, typename A2>struct T_Funct<const R (T::*)(A1, A2)const >{ typedef true_type IsMethod; const R (T::*function_)(A1,A2)const; explicit T_Funct(const R (T::*method)( A1, A2)const):function_(method){} R Run(T* object, A1 a1, A2 a2){ return (object->*function_)(a1,a2); } }; int show_int(int , int ){ return printf("print_int is invoked...\n"); } struct MyFoo{ typedef int (MyFoo::*PFUN_NONE)(int , int ); typedef int (MyFoo::*PFUN_NEXT_CONST)(int , int )const; typedef const int (MyFoo::*PFUN_PRIOR_CONST)(int , int ); typedef const int (MyFoo::*PFUN_NEXT_PRIOR_CONST)(int , int )const; int show_myfoo_none(int i, int j){ return printf("MyFoo::show_myfoo_none is invoked...\n"); } int show_myfoo_next_const(int i, int j)const{ return printf("MyFoo::show_myfoo_next_const is invoked...\n"); } const int show_myfoo_prior_const(int i, int j){ return printf("MyFoo::show_myfoo_prior_const is invoked...\n"); } const int show_myfoo_next_prior_const(int i, int j)const{ return printf("MyFoo::show_myfoo_next_prior_const is invoked...\n"); } }; int _tmain(int argc, _TCHAR* argv[]) { typedef int (*p_fun_int)(int, int ); p_fun_int fun_int; fun_int = show_int; T_Funct<int (*)( int , int) > t_funct(fun_int, 1,2); t_funct(); MyFoo f; MyFoo::PFUN_NONE pfun_none; MyFoo::PFUN_NEXT_CONST pfun_next_const; MyFoo::PFUN_PRIOR_CONST pfun_prior_const; MyFoo::PFUN_NEXT_PRIOR_CONST pfun_next_prior_const; pfun_none = &MyFoo::show_myfoo_none; pfun_next_const = &MyFoo::show_myfoo_next_const; pfun_prior_const = &MyFoo::show_myfoo_prior_const; pfun_next_prior_const = &MyFoo::show_myfoo_next_prior_const; T_Funct<int (MyFoo::*)(int, int )> t_2(pfun_none); T_Funct<int (MyFoo::*)(int, int )const> t_3(pfun_next_const); T_Funct<const int (MyFoo::*)(int, int )> t_4(pfun_prior_const); T_Funct<const int (MyFoo::*)(int, int )const> t_5(pfun_next_prior_const); t_2.Run(&f, 2,3); t_3.Run(&f, 2,3); t_4.Run(&f, 2,3); t_5.Run(&f, 2,3); return 0; }