簡體   English   中英

c ++ 11 std :: thread和類友元函數之間的交互

[英]Interaction between c++11 std::thread and class friend function

我無法理解編譯器錯誤我正在嘗試使用聲明為c ++ 11 std::thread對象中的類的朋友的函數。 我創建了一個小例子來展示我遇到的問題。 基本上,當編譯器只看到aafriend函數原型時,當該函數傳遞給線程對象時,它會拋出一個未定義的符號錯誤。 我正在使用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的定義中那樣,您需要事先在全局命名空間中聲明它,或者將定義移動到更早的點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM