2011-01-31 38 views
1

假設我有以下兩個模板類:如何在衆多一對多友誼兩個模板類的鏈接?

template <class _A> 
class First 
{ 
private: 
    int a; 
}; 

template <class _B> 
class Second 
{ 
private: 
    int b; 
}; 

我怎麼能在許多一對多友情鏈接它們。例如,在First中添加一個打印第二個參數對象b的方法。

是清楚我的問題?

+0

沒有,目前還不清楚你的意思。你想讓每個班都成爲另一個班的朋友嗎? – CashCow 2011-01-31 00:24:37

回答

3
template <typename T> 
class First { 
    int a; 
    template<typename> friend class Second; 
}; 
template <typename T> 
class Second 
{ 
    int b; 
    template<typename> friend class First; 
}; 

這將使每First<T>訪問每一個Second<U>的內部。現在,雖然這是技術解決方案,你可能要考慮循環依賴開放內部其他類中的任何實例化一個設計是否是您的特定問題的最佳解決方案。

順便說一句,如果你只希望授予First<int>訪問Second<int>(而不是Second<double>),你能做到這一點,像這樣:

template <typename> class Second; 
template <typename T> 
class First { 
    int a; 
    friend class Second<T>; // only befriend the same instantiation 
}; 
template <typename T> 
class Second { 
    int b; 
    friend class First<T>; 
}; 

在第二個版本中,你需要結交之前Second模板的向前聲明一個特定的實例化,但是這允許您只將訪問類的內部授權給特定的實例化。

0

你可以與每個類的聲明開始:

template< typename T > class First; 
template< typename T > class Second; 

而現在這兩個類會知道另一個在他們的定義。如果需要,你可以在那裏宣佈他們爲朋友。

template< typename T > class First 
{ 
    template< typename U> friend class Second; 
}; 

和相反。

您還可以實現在類定義的函數體,如果他們需要看到對方的詳細信息,即他們不能使用「向前宣言」副本。

0

假設你懂得保護,是模板的問題向前聲明:

#include <iostream> 

template <class _B> class Second; // Forward declare 

template <class _A> 
class First 
{ 
public: 
    template<class _B> 
    void print(const Second<_B>& b) 
    { 
     std::cout << b.b << std::endl; 
    } 
    int a; 
}; 

template <class _B> 
class Second 
{ 
public: 
    int b; 
}; 

void testIt() 
{ 
    Second<double> sd; 
    First<int >fi; 
    fi.print<double>(sd); 
}