我无法理解编译器错误我正在尝试使用声明为c 11 std :: thread对象中的类的朋友的函数.我创建了一个小例子来展示我遇到的问题.基本上,当编译器只看到aa的友元函数原型时,当该函数传递给线程对象时,它会抛出一个未定义的符号错误.我正在使用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的定义之上添加函数的另一个原型声明,例如:
void aa(A &p);
它使用线程对象声明编译好.
那么,当我尝试仅使用友元原型声明线程对象时,为什么编译器会反对?
我意识到在这个简单的例子中我可以将aa的声明移到A :: av的定义之上,但是在实践中我想做一些更复杂的事情,我有一个包含B :: av的派生类B,以及aa的定义逻辑上放在A的实现文件中,而带有aa原型的A类定义位于包含在B类定义中的头文件中.所以这是编译器错误,或者是我的方式问题我宣布了什么?
解决方法:
只有一个类内声明,友元函数只能通过参数依赖查找.要按名称指定它而不调用它,就像在av的定义中那样,您需要事先在全局命名空间中声明它,或者将定义移动到更早的点.
标签:stdthread,c,c11,friend 来源: https://codeday.me/bug/20190830/1764747.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。