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

时间:2016-11-26 15:07:38

标签: c++ multithreading iso

我正在尝试以下代码:

std::thread t(&(Transmitter::sender), this, some_variables);

其中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]

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

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

1 个答案:

答案 0 :(得分:7)

错误信息非常清楚。

  

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

来自expr.unary.op

  

指向成员的指针仅在显式&amp;使用和它的操作数是一个未括在括号中的限定id。 [注意:表达式&amp;(qualified-id),其中qualified-id括在括号中,不形成“指向成员的指针”类型的表达式。也不是qualified-id,因为没有从非静态成员函数的qualified-id到类型“指向成员函数的指针”的隐式转换,因为从函数类型的左值到类型“指向函数的指针” ([conv.func])。即使在nonqualified-id类的范围内,也不是&amp; unsqualified-id指向成员的指针。 - 结束说明]

您需要使用:

    std::thread t(&Transmitter::sender, this, some_variables);

请参阅this demo