2016-07-27 7 views
1

나는멤버 템플릿 클래스를 둘러싸는 클래스의 친구로 선언하려면 어떻게해야합니까?

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

가 어떻게 HelperfriendTestBuilder의 몇 가지 클래스를 만들 수 있죠 있나요? 내가 시도 :

template<typename Int> 
    friend class Helper; 

하지만 그냥은 TestBuilder의 중첩 클래스는 네임 스페이스 범위의 친구 TestBuilder

+1

도우미는 TestBuilder 내에 중첩되어 있으며, TestBuilder 개체의 모든 private 멤버에 대한 모든 권한을 이미 갖습니다. – 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의 개인 회원 (! 물론) 액세스 할 수 없습니다 :

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; 
    } 
}; 
관련 문제