[英]Interaction between c++11 std::thread and class friend function
我無法理解編譯器錯誤我正在嘗試使用聲明為c ++ 11 std::thread
對象中的類的朋友的函數。 我創建了一個小例子來展示我遇到的問題。 基本上,當編譯器只看到aa
的friend
函數原型時,當該函數傳遞給線程對象時,它會拋出一個未定義的符號錯誤。 我正在使用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.