にプライベートメンバーに達することができないコードを検討してください:C++グローバルにextern "C" の友人は、名前空間、クラス
#include <iostream>
using namespace std;
extern "C"
void foo(void);
namespace A
{
template< int No >
class Bar
{
private:
friend void ::foo(void);
static void private_func(int n);
};
template< int No >
void Bar<No>::private_func(int n)
{
cout << "A:Bar< " << No << ">::private_func(" << n << ")" << endl;
}
}
extern "C"
void foo(void)
{
A::Bar<0>::private_func(1);
}
int main()
{
cout << " ---- " << endl;
foo();
}
G ++が与える:
> g++ -Wall -o extern_c extern_c.cpp
extern_c.cpp: In function ‘void foo()’:
extern_c.cpp:20:7: error: ‘static void A::Bar<No>::private_func(int) [with int No = 0]’ is private
extern_c.cpp:29:31: error: within this context
私はnamspace A
コメントした場合、それがコンパイルされます正しく実行してください。
私には何が欠けていますか?
私は関連トピックを見ましたが、私の問題に合ったものは見つかりませんでした。
- C++: namespace conflict between extern "C" and class member
- Why this friend function can't access a private member of the class?
おかげで人々。
EDIT:
私は今extern "C"
が問題とは何の関係もないと確信しています。 無視してください。
実際の 'foo()'を名前空間に入れるのは簡単ではありません。なぜなら、それは割り込みサービスルーチンなので、とにかく試してみるつもりです。ありがとう。 – j4x
私はこの男が同じ問題を抱えていると思いますが、どちらも答えられていません:http://stackoverflow.com/questions/2236712/how-do-i-define-a-friend-class-from-the-global-namespace- in-another-namespace –
同じ問題があるようですが、空の名前空間の提案は機能しません。同じエラーが表示されます。 – j4x