2016-07-27 8 views
1

私はいくつかのクラスメンバーテンプレートクラスを囲むクラスの友人と宣言するにはどうすればよいですか?

template<typename Fun, typename Arg> 
    class TestBuilder 
    { 
    template<typename Int> 
     class Helper 
     {}; 
    }; 

どのように私はTestBuilderHelperfriendを作るのですがありますか? は、私が試した:

template<typename Int> 
    friend class Helper; 

が、それはそれは、TestBuilderの入れ子になったクラスがある名前空間スコープの友人TestBuilder

+1

HelperはTestBuilder内にネストされていますが、既にTestBuilderオブジェクトのプライベートメンバーにフルアクセスできます。 – Davidbrcz

答えて

3

しかしHelperHelperクラスの友人をされていないのですか?

#include <iostream> 

using namespace std; 

template<typename Fun, typename Arg> 
class TestBuilder 
{ 
    int n; 
    char c; 

public: 
    template<typename Int> 
    class Helper 
    { 
    public: 
    void print(TestBuilder& tb) { 
     std::cout << tb.n << " " << tb.c << std::endl; 
    } 
    }; 
    TestBuilder(int n, char c) : n(n), c(c) {} 

}; 

int main() { 
     TestBuilder<int, int> tb(5, 'p'); 
     TestBuilder<int, int>::Helper<int> h; 
     h.print(tb); 

     return 0; 
} 

出力は以下となります:

C02QT2UBFVH6-lm:~ gsamaras$ pico main.cpp 
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
5 p 
:)結果

は、それは、例を確認し、外側のクラスのメンバー(はい、そのプライベートメンバー)へのアクセス権を持っています


しかし、別のクラス(ネストされたクラスではなく、別のクラス)を追加すると、プライベートメンバーTestBuilderにはアクセスできません(もちろん!

0123)。
class alienClass 
{ 
public: 
    /* 
    That won't work, you will get: 
    error: 'n' is a private member of 'TestBuilder<int, int>' 
    error: 'c' is a private member of 'TestBuilder<int, int>' 
    */ 
    void print(TestBuilder<int, int>& tb) { 
    std::cout << tb.n << " " << tb.c << std::endl; 
    } 
}; 
関連する問題