如何在多对多友谊中链接两个模板类?

时间:2011-01-31 00:04:22

标签: c++ templates many-to-many friend-class

假设我有以下两个模板类:

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

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

如何在多对多的友谊中将它们联系起来。例如,在First中添加一个方法,打印参数对象的第二个b。

我的问题清楚了吗?

3 个答案:

答案 0 :(得分: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模板进行前向声明,但这允许您仅对特定实例化授予对类的内部的访问权。

答案 1 :(得分:0)

您可以从每个班级的声明开始:

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

现在两个班级都会在他们的定义中了解另一个班级。如果需要,您可以将其声明为朋友。

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

反之亦然。

如果需要查看彼此的详细信息,也可以在类定义下实现函数体,即它们不能使用“前向声明”副本。

答案 2 :(得分: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);
}