class
extern "C"
関数を使って
class
の友達を作ろうとすると、このコードは動作します:
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