如何写一个指针的定义,指针指向类的成员函数

john 2014-04-24 09:55:41
//问题:如何写一个指针类型的定义,个指针类型是一个指向类模板中(泛型)类中定义的类成员函数的指针。
template < typename T1 ,typename T2>
class temp_test
{
private:
T1 m1;
public:
T2 m2;
void fun(void);
} ;

template <typename T1 , typename T2> void temp_test<typename T1 , typename T2>::fun(void)
{
}

//如下尝试均失败
//typedef void (temp_test<typename T1 , typename T2>::* p_template_class_fun)(void); //error C2065: 'T1' : undeclared identifier
//typedef void (temp_test::* p_template_class_fun)(void); //error C2955: 'temp_test' : use of class template requires template argument list
...全文
201 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
unituniverse2 2014-04-24
  • 打赏
  • 举报
回复
没法编辑。。。。 template < typename T1 ,typename T2> using p_template_class_fun = void (temp_test<T1, T2>::*)(void); p_template_class_fun<int, float> p1 = &temp_test<int, float>::fun;
unituniverse2 2014-04-24
  • 打赏
  • 举报
回复
template < typename T1 ,typename T2> using p_template_class_fun = void (temp_test<T1, T2>::* p_template_class_fun)(void); p_template_class_fun<int, float> p1 = &temp_test<int, float>::fun;
john 2014-04-24
  • 打赏
  • 举报
回复
不对。……....
赵4老师 2014-04-24
  • 打赏
  • 举报
回复
//C++ Operators
//  Operators specify an evaluation to be performed on one of the following:
//    One operand (unary operator)
//    Two operands (binary operator)
//    Three operands (ternary operator)
//  The C++ language includes all C operators and adds several new operators.
//  Table 1.1 lists the operators available in Microsoft C++.
//  Operators follow a strict precedence which defines the evaluation order of
//expressions containing these operators.  Operators associate with either the
//expression on their left or the expression on their right;    this is called
//“associativity.” Operators in the same group have equal precedence and are
//evaluated left to right in an expression unless explicitly forced by a pair of
//parentheses, ( ).
//  Table 1.1 shows the precedence and associativity of C++ operators
//  (from highest to lowest precedence).
//
//Table 1.1   C++ Operator Precedence and Associativity
// The highest precedence level is at the top of the table.
//+------------------+-----------------------------------------+---------------+
//| Operator         | Name or Meaning                         | Associativity |
//+------------------+-----------------------------------------+---------------+
//| ::               | Scope resolution                        | None          |
//| ::               | Global                                  | None          |
//| [ ]              | Array subscript                         | Left to right |
//| ( )              | Function call                           | Left to right |
//| ( )              | Conversion                              | None          |
//| .                | Member selection (object)               | Left to right |
//| ->               | Member selection (pointer)              | Left to right |
//| ++               | Postfix increment                       | None          |
//| --               | Postfix decrement                       | None          |
//| new              | Allocate object                         | None          |
//| delete           | Deallocate object                       | None          |
//| delete[ ]        | Deallocate object                       | None          |
//| ++               | Prefix increment                        | None          |
//| --               | Prefix decrement                        | None          |
//| *                | Dereference                             | None          |
//| &                | Address-of                              | None          |
//| +                | Unary plus                              | None          |
//| -                | Arithmetic negation (unary)             | None          |
//| !                | Logical NOT                             | None          |
//| ~                | Bitwise complement                      | None          |
//| sizeof           | Size of object                          | None          |
//| sizeof ( )       | Size of type                            | None          |
//| typeid( )        | type name                               | None          |
//| (type)           | Type cast (conversion)                  | Right to left |
//| const_cast       | Type cast (conversion)                  | None          |
//| dynamic_cast     | Type cast (conversion)                  | None          |
//| reinterpret_cast | Type cast (conversion)                  | None          |
//| static_cast      | Type cast (conversion)                  | None          |
//| .*               | Apply pointer to class member (objects) | Left to right |
//| ->*              | Dereference pointer to class member     | Left to right |
//| *                | Multiplication                          | Left to right |
//| /                | Division                                | Left to right |
//| %                | Remainder (modulus)                     | Left to right |
//| +                | Addition                                | Left to right |
//| -                | Subtraction                             | Left to right |
//| <<               | Left shift                              | Left to right |
//| >>               | Right shift                             | Left to right |
//| <                | Less than                               | Left to right |
//| >                | Greater than                            | Left to right |
//| <=               | Less than or equal to                   | Left to right |
//| >=               | Greater than or equal to                | Left to right |
//| ==               | Equality                                | Left to right |
//| !=               | Inequality                              | Left to right |
//| &                | Bitwise AND                             | Left to right |
//| ^                | Bitwise exclusive OR                    | Left to right |
//| |                | Bitwise OR                              | Left to right |
//| &&               | Logical AND                             | Left to right |
//| ||               | Logical OR                              | Left to right |
//| e1?e2:e3         | Conditional                             | Right to left |
//| =                | Assignment                              | Right to left |
//| *=               | Multiplication assignment               | Right to left |
//| /=               | Division assignment                     | Right to left |
//| %=               | Modulus assignment                      | Right to left |
//| +=               | Addition assignment                     | Right to left |
//| -=               | Subtraction assignment                  | Right to left |
//| <<=              | Left-shift assignment                   | Right to left |
//| >>=              | Right-shift assignment                  | Right to left |
//| &=               | Bitwise AND assignment                  | Right to left |
//| |=               | Bitwise inclusive OR assignment         | Right to left |
//| ^=               | Bitwise exclusive OR assignment         | Right to left |
//| ,                | Comma                                   | Left to right |
//+------------------+-----------------------------------------+---------------+
赵4老师 2014-04-24
  • 打赏
  • 举报
回复
//| ->* | Dereference pointer to class member | Left to right |
john 2014-04-24
  • 打赏
  • 举报
回复
解决了!!!
unituniverse2 2014-04-24
  • 打赏
  • 举报
回复
引用 11 楼 JohnPhan 的回复:
有用。 实际问题是来自一个开源项目源代码中演绎出来的。QP:http://www.state-machine.com/qp/
当然没用 说”有用“只是限于研究原理、学习用,除非你想自己写个编译器。否则这样的代码在其他编译器上不一定能正常工作的
john 2014-04-24
  • 打赏
  • 举报
回复
有用。 实际问题是来自一个开源项目源代码中演绎出来的。QP:http://www.state-machine.com/qp/
unituniverse2 2014-04-24
  • 打赏
  • 举报
回复
引用 7 楼 JohnPhan 的回复:
请教,[为何执行结果获得的是一样的地址?
template < typename T1 , typename T2> class temp_test { private: T1 m1; public: T2 m2; void fun(void); //一下定义只能写在内的内部,写在类的外部的语法未知 typedef void (temp_test::* p_template_class_fun_ex1)(void); //指向类成员函数的指针 类型 typedef void (temp_test< typename T1 , typename T2>::* p_template_class_fun_ex2)(void);//另一种写法 p_template_class_fun_ex1 fun_ex1(void) //这个函数也只能写在类的内部,在类的外部的语法未知 { return &temp_test<T1, T2>::fun; }; p_template_class_fun_ex2 fun_ex2(void) { return &temp_test<T1, T2>::fun; }; } ; template <typename T1 , typename T2> void temp_test< T1 , T2>::fun(void) { } //如下尝试均失败 //typedef void (temp_test<typename T1 , typename T2>::* p_template_class_fun)(void); //error C2065: 'T1' : undeclared identifier //typedef void (temp_test::* p_template_class_fun)(void); //error C2955: 'temp_test' : use of class template requires template argument list //typedef void (temp_test<int , int>::* p_template_class_fun)(void); int _tmain(int argc, _TCHAR* argv[]) { temp_test<int, int> obj_int; printf("obj_int fun addr: &temp_test<char, char>::fun =%p\r\n", &temp_test<string, string>::fun); printf("obj_int fun addr: &temp_test<int, int>::fun =%p\r\n", &temp_test<int, int>::fun); printf("obj_int fun addr: obj_int.fun_ex1() =%p\r\n", obj_int.fun_ex1()); printf("obj_int fun addr: obj_int.fun_ex2() =%p\r\n", obj_int.fun_ex2()); system("pause"); return 0; } //执行结果 //obj_int fun addr: &temp_test<char, char>::fun =00D01700 <<<<<<<<< //obj_int fun addr: &temp_test<int, int>::fun =00D01700 <<<<<<<<<为啥与上一行是一样的地址 //obj_int fun addr: obj_int.fun_ex1() =00D01700 //obj_int fun addr: obj_int.fun_ex2() =00D01700 //请按任意键继续. . .
这个东西在vc里的实现,32位下面是48位的,64位下面是80位的,还有你这样去搞成员地址是不对的。 成员函数/变量指针实际上不是指针(即使是做为类型也不是)。编译器的具体实现就不要纠结了吧,没用的
john 2014-04-24
  • 打赏
  • 举报
回复
原因找到了。是“优化”搞的鬼。去掉优化就正确了。 顺答复#8楼,纯属蹂躏C++玩。没别的意思。
ri_aje 2014-04-24
  • 打赏
  • 举报
回复
都有 auto 和 decltype 了还受这罪?
john 2014-04-24
  • 打赏
  • 举报
回复
请教,[为何执行结果获得的是一样的地址?
template < typename T1 , typename T2> class temp_test { private: T1 m1; public: T2 m2; void fun(void); //一下定义只能写在内的内部,写在类的外部的语法未知 typedef void (temp_test::* p_template_class_fun_ex1)(void); //指向类成员函数的指针 类型 typedef void (temp_test< typename T1 , typename T2>::* p_template_class_fun_ex2)(void);//另一种写法 p_template_class_fun_ex1 fun_ex1(void) //这个函数也只能写在类的内部,在类的外部的语法未知 { return &temp_test<T1, T2>::fun; }; p_template_class_fun_ex2 fun_ex2(void) { return &temp_test<T1, T2>::fun; }; } ; template <typename T1 , typename T2> void temp_test< T1 , T2>::fun(void) { } //如下尝试均失败 //typedef void (temp_test<typename T1 , typename T2>::* p_template_class_fun)(void); //error C2065: 'T1' : undeclared identifier //typedef void (temp_test::* p_template_class_fun)(void); //error C2955: 'temp_test' : use of class template requires template argument list //typedef void (temp_test<int , int>::* p_template_class_fun)(void); int _tmain(int argc, _TCHAR* argv[]) { temp_test<int, int> obj_int; printf("obj_int fun addr: &temp_test<char, char>::fun =%p\r\n", &temp_test<string, string>::fun); printf("obj_int fun addr: &temp_test<int, int>::fun =%p\r\n", &temp_test<int, int>::fun); printf("obj_int fun addr: obj_int.fun_ex1() =%p\r\n", obj_int.fun_ex1()); printf("obj_int fun addr: obj_int.fun_ex2() =%p\r\n", obj_int.fun_ex2()); system("pause"); return 0; } //执行结果 //obj_int fun addr: &temp_test<char, char>::fun =00D01700 <<<<<<<<< //obj_int fun addr: &temp_test<int, int>::fun =00D01700 <<<<<<<<<为啥与上一行是一样的地址 //obj_int fun addr: obj_int.fun_ex1() =00D01700 //obj_int fun addr: obj_int.fun_ex2() =00D01700 //请按任意键继续. . .

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧