gpt4 book ai didi

c++ - c++11 std::thread 与类友元函数的交互

转载 作者:太空狗 更新时间:2023-10-29 20:38:59 25 4
gpt4 key购买 nike

我无法理解编译器错误我正在尝试使用声明为 c++11 std::thread 对象中的类的友元函数。我创建了一个小示例来说明我遇到的问题。基本上,当编译器只看到 aafriend 函数原型(prototype)时,它会在将该函数传递给线程对象时抛出一个 undefined symbol 错误。我正在使用 g++ 4.9.2。

//test.cpp
#include <thread>

class A {
public:
friend void aa(A &p);
void av(void);
};

void A::av() {
std::thread t1(aa,std::ref(*this));
}

void aa(A &p) {
p;
}

int main() {
A ai;
ai.av();
return 0;
}

编译命令:

g++ -o test test.cpp -g -O0 -std=c++11 -lpthread

我得到编译器错误:

test.cpp: In member function ‘void A::av()’:
test.cpp:12:18: error: ‘aa’ was not declared in this scope
std::thread t1(aa,std::ref(*this));

在上面,如果我替换行

std::thread t1(aa,std::ref(*this));

aa(*this);

这编译得很好。或者,如果我在 A::av 的定义之上添加另一个函数原型(prototype)声明,例如:

void aa(A &p);

使用线程对象声明可以很好地编译。

那么,当我尝试仅使用友元原型(prototype)声明线程对象时,为什么编译器会反对?

我意识到在这个简单的例子中我可以将 aa 的声明移到 A::av 的定义之上,但是实际上我想做一些更复杂的事情我有一个包含B::av的派生类Baa的定义逻辑上放在了A的实现文件中,而 aa 原型(prototype)的类 A 的定义位于类 B 定义中包含的头文件中.这是编译器错误,还是我声明某些内容的方式有问题?

最佳答案

仅通过类内声明,友元函数只能通过参数相关查找获得。要通过名称指定它而不调用它,就像您在 av 的定义中所做的那样,您需要事先在全局命名空间中声明它,或者将定义移到更早的位置。

关于c++ - c++11 std::thread 与类友元函数的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29498881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com