'&安培;' :绑定成员函数表达式的非法操作

时间:2015-01-20 16:24:33

标签: c++

当我尝试使用带有main函数的单个cpp文件

时,这是有效的
 sprintf(smem_options ,
     "#transcode{vcodec=RV24}:smem{"
     "video-prerender-callback=%lld,"
     "no-time-sync},"
    , (long long int)(intptr_t)(void*)&cbVideoPrerender
);

如何将函数参数传递给类中的sprintf?

sprintf(smem_options ,
     "#transcode{vcodec=RV24}:smem{"
     "video-prerender-callback=%lld,"
     "no-time-sync},"
    , (long long int)(intptr_t)(void*)&cbVideoPrerender
);

我得到的错误信息是:错误C2276:'&' :对绑定成员函数表达式的非法操作

2 个答案:

答案 0 :(得分:13)

假设cbVideoPrerenderer是第二个示例中的成员函数,您需要说&Foo::cbVideoPrerenderer其中Foo是其所属的类。

但只有当它是静态成员函数时才会有效。非静态成员函数与普通函数不同,当您使用&Foo::bar语法形成指向成员函数的指针时,您获取的内容无法转换为void*(通常是比指针大两倍的东西,因为它包含有关对象类型的信息。)

答案 1 :(得分:4)

你要做的是在C ++ 11中有条件支持的行为, 在这两种情况下,在早期版本中都是非法的。你不能可靠 将指向函数(成员或其他)的指针转换为void*。 (我曾经在一个指向函数的指针是32位的系统上工作,但是a void*只有16。)

在实践中,大多数编译器(非法地,在C ++之前的11版本中)会忽略 非成员函数的错误。 Posix需要这个功能 指针和数据指针是兼容的,它们在Windows下 好。 (今天:只有他们不适合我的系统才是 早期的Unix。)至于指向成员的指针:指向静态成员的指针 有一个与函数指针兼容的类型(因此可以使用 练习,如果编译器允许它),但指向非静态的指针 会员有一个完全不同的类型,通常有不同的大小, 和不同的代表。关于唯一可靠的方法 输出一个是一系列字节值:将地址正确放入 键入变量,获取该变量的地址,将其转换为 unsigned char const*,然后使用"%02x"输出每个字节。

但真正的问题是你想要这样做的原因。没有什么 无论你如何,你都可以可靠地处理你输出的值 输出它。