試圖使class
朋友與extern "C"
功能,此代碼的工作:友誼爲extern「C」的功能似乎需要::資格名稱
#include <iostream>
extern "C" {
void foo();
}
namespace {
struct bar {
// without :: this refuses to compile
friend void ::foo();
bar() : v(666) {}
private:
int v;
} inst;
}
int main() {
foo();
}
extern "C" {
void foo() {
std::cout << inst.v << std::endl;
}
}
但我很驚訝地發現,與G ++ 4.6.1和4.4.4我必須在friend void ::foo();
中明確寫出::
,否則友誼不起作用。但只有在extern "C"
時才需要此::
。
- 這是一個編譯器錯誤/問題?我並不期待這種行爲。
- 如果它不是一個錯誤,爲什麼這是必需的,但只有當它是
extern "C"
而不是沒有它?怎麼樣的名稱查找規則的變化,這使得這是必要的?
我很難過。這可能有一些我無法找到的規則。
(http://codepad.org/Hw7JC8Ky )[這裏](http://codepad.org/9qVdlrhC)是測試用例。 –
嗯,那是一個錯誤呢?我無法在查找規則中找到任何可以解釋爲什麼'extern「」C「'和匿名''namespace'需要''''但是刪除或者不需要它的組合。雖然我對名稱查詢細節的瞭解很朦朧,但這是基於搜索的。 – Flexo
@ TomalakGeret'kal - 它不會使用任何'extern「C''+'namespace',而不僅僅是匿名的。 – Flexo