声明好友模板类

时间:2015-06-23 06:10:29

标签: c++ templates friend

我有一个看起来像的第一堂课:

template <typename T1, typename T2> class A

和第二个类看起来像:

template <typename T1> class B

现在我想宣布A<T1, T2>始终是B<T1>的朋友。所以我试过了:

// B.h

template <typename T1> class B
{
    template <typename T2> friend class A<T1, T2>;

    public:
    ... 
}

但这似乎不起作用。我该怎么办?

1 个答案:

答案 0 :(得分:3)

鉴于您有单独的文件,A.h和B.h以及只有A<T1,T2>应该是B<T1>的朋友的条件,那么:

//B.h
template <typename T>
class B
{
private:
    T x;
public:
    B(T value);
    //note: B<T> befriends A<T,T1>
    template<typename T, typename T1> friend class A;
};
template<typename T>
B<T>::B(T value)
{
    x = value;
}

//A.h
#include "B.h"
template <typename T1, typename T2>
class A
{
public:
    //note B<T1> and A<T1,T2>
    T1 get(B<T1> &b);
};
template<typename T1, typename T2>
T1 A<T1, T2>::get(B<T1>& b)
{
    return b.x;
} 

//test.cpp
#include <iostream>
#include "A.h"
#include "B.h"
using namespace std;

int main()
{
    B<int> b(3);
    A<int, char> a;
    cout << a.get(b) << endl;  //3

    return 0;
}
//test.2
B<string> b("test");
A<string,double> a;
cout << a.get(b) << endl; //"test"

//test.3 
B<int> b(3);
A<double,int> a;
cout << a.get(b) << endl; //error: