错误:ISO C++禁止获取非限定或带括号的非静态成员函数的地址以形成指向成员函数的指针

Abb*_*sal 3 c++ multithreading iso

我正在尝试以下代码:

std::thread t(&(Transmitter::sender), this, some_variables);
Run Code Online (Sandbox Code Playgroud)

其中sender是同一个类的成员函数,从该方法调用上面的行.

我收到警告:

Transmitter.h: In member function 'int Transmitter::transmit_streams(std::vector<std::vector<single_stream_record> >, int, Receiver&)':
Transmitter.h:81:44: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function.  Say '&Transmitter::sender' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

虽然它编译并运行良好.如何删除此警告.

我的g ++是4.6.3,我用-std = c ++ 0x编译代码.

Dan*_*anh 9

错误消息非常清楚.

ISO C++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针.说'&Transmitter :: sender'[-fpermissive]

来自expr.unary.op

仅当使用显式&时,才会形成指向成员的指针,并且其操作数是未括在括号中的qualified-id.[注意:也就是说,表达式&(qualified-id),其中qualified-id括在括号中,不形成"指向成员的指针"类型的表达式.也不是qualified-id,因为没有从非静态成员函数的qualified-id到类型"指向成员函数的指针"的隐式转换,因为从函数类型的左值到类型"指向函数的指针" ([conv.func]).即使在unqualified-id类的范围内,也不是&nonqualified-id指向成员的指针. - 结束说明]

你需要使用:

    std::thread t(&Transmitter::sender, this, some_variables);
Run Code Online (Sandbox Code Playgroud)

这个演示

  • 这个答案有一个例子解释了为什么这样做 - /sf/answers/499700771/ (2认同)