【问题标题】:error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function错误:ISO C++ 禁止使用不合格或带括号的非静态成员函数的地址来形成指向成员函数的指针
【发布时间】:2025-12-15 02:35:01
【问题描述】:

我正在尝试以下代码:

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 编译代码。

【问题讨论】:

    标签: c++ multithreading iso


    【解决方案1】:

    错误信息很清楚。

    ISO C++ 禁止使用不合格或带括号的非静态成员函数的地址来形成指向成员函数的指针。说 '&Transmitter::sender' [-fpermissive]

    来自expr.unary.op

    只有在使用显式 & 并且 其操作数是不包含在括号中的限定 ID 时才会形成指向成员的指针。 [ 注意:即表达式 &(qualified-id) ,其中qualified-id 括在括号中,不形成“指向成员的指针”类型的表达式。限定 ID 也没有,因为没有从非静态成员函数的限定 ID 到类型“指向成员函数的指针”的隐式转换,因为从函数类型的左值到类型“指向函数的指针” ([conv.func])。 &unqualified-id 也不是指向成员的指针,即使在 unqualified-id 类的范围内也是如此。 ——尾注]

    你需要使用:

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

    this demo

    【讨论】:

    • 是的,您的代码似乎有效。虽然是 C++ 新手,但我不明白为什么。我的意思是,你和我的区别只是你的在 Transmitter::sender 周围缺少括号。
    • @AbbasFaisal 因为 ISO C++ 是这么说的,请看我的编辑
    • 这个答案有一个例子解释了为什么这样做 - *.com/a/7138582/1000551