2016-07-27 86 views
1

我有一些類如何將封閉類的朋友聲明爲成員模板類?

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

如何使HelperTestBuilder一個friend? 我想:

template<typename Int> 
    friend class Helper; 

但這隻會命名空間範圍的朋友HelperTestBuilder

+1

Helper嵌套在TestBuilder中,它已經有了對任何TestBuilder對象的私有成員的完全訪問權限。 – Davidbrcz

回答

3

Helper朋友是TestBuilder的嵌套類,不是嗎? :)

其結果是,它可以訪問外部類的成員(是的,和它的私有成員),檢查例如:

#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; 
    } 
};