首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++11 std::线程与类朋友函数的交互

c++11 std::线程与类朋友函数的交互
EN

Stack Overflow用户
提问于 2015-04-07 18:44:45
回答 1查看 819关注 0票数 3

我在理解编译器错误时遇到了困难,我试图使用一个函数作为c++11 std::thread对象中的类的朋友。我创造了一个小例子来说明我的问题。基本上,当编译器只看到friend函数的aa原型时,当该函数被传递到线程对象时,它会抛出一个未定义的符号错误。我使用的是g++ 4.9.2。

代码语言:javascript
复制
//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;
}

编译器命令:

代码语言:javascript
复制
g++ -o test test.cpp -g -O0 -std=c++11 -lpthread

我得到编译器错误:

代码语言:javascript
复制
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));

在上面,如果我替换行

代码语言:javascript
复制
std::thread t1(aa,std::ref(*this));

使用

代码语言:javascript
复制
aa(*this);

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

代码语言:javascript
复制
void aa(A &p);

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

那么,为什么当我试图用with原型声明线程对象时,编译器会反对呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-07 18:49:11

只有在类内声明的情况下,朋友函数只能通过依赖于参数的查找获得.要在不调用它的情况下按名称指定它,就像在av的定义中所做的那样,您需要事先在全局命名空间中声明它,或者将定义移到更早的位置。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29498881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档