2016-04-28 9 views
2

私は実際に1つのテンプレートクラスを別のテンプレートクラスと友人にしようとしています。 そのような何か:Friend && Template

#include <iostream> 

template < typename T > 
class Test1 { 

    private: 
    static int wantToBeFriend; 
}; 

template < typename T > 
int Test1<T>::wantToBeFriend = 1; 


template < typename T > 
class Test2 { 

    friend class Test1<T>; 

    public: 
    void run() { 

     std::cout << Test1<T>::wantToBeFriend << std::endl; 
    } 
}; 

int main() 
{ 
    Test1<int> test1; 
    Test2<int> test2; 

    test2.run(); 
    return 0; 
} 

しかし、私はそれを行うことができないんだけど、gccがint Test1<T>::wantToBeFriend is privateと言います。 これを達成する方法は誰でも知っていますか?

おかげ

+0

友人は友情の*贈り主の*で宣言されています。受信機ではありません。 – WhozCraig

+0

申し訳ありません...私はあまり働いていると思います。とにかく、これを削除します! –

答えて

3

友情は、あなたがそれを動作させるためにしようとしているように動作しません。あなたはTest1<T>Test2<T>のプライベートメンバーにアクセスできることを意味し

friend class Test1<T>; 

を持っている場合。それはTest1<T>のプライベートメンバーにアクセスするためにTest2<T>を許可しません。それができれば、あなたは自分自身をクラスの友人にしてアクセスすることができるので、プライベートメンバーを持つことには意味がありません。

我々は

template < typename T > 
class Test2; 

template < typename T > 
class Test1 { 
    friend class Test2<T>; 

    private: 
    static int wantToBeFriend; 
}; 

のようにそれを周りに切り替えた場合、コードは今Test2<T>として罰金コンパイルは、プライベートメンバー(Live Example)にアクセスすることができます。

+0

私はこれを削除しようとしていましたが、私はあなたの答えを受け入れます。ありがとう! –

+0

@MathieuVanNevel問題ありません。どういたしまして。 – NathanOliver

1

あなたはそれ以外の方法で行う必要があります。 Test1はフレンドクラスとしてTest2を宣言する必要があります。

#include <iostream> 

template <typename T> class Test2; 

template < typename T > 
class Test1 { 
    template <typename U> friend class Test2; 
    private: 
    static int wantToBeFriend; 
}; 

template < typename T > 
int Test1<T>::wantToBeFriend = 1; 


template < typename T > 
class Test2 { 

    public: 
    void run() { 

     std::cout << Test1<T>::wantToBeFriend << std::endl; 
    } 
}; 

int main() 
{ 
// Test1<int> test1; 
    Test2<int> test2; 

    test2.run(); 
    return 0; 
} 

Live Demo