假设我有以下两个模板类:
template <class _A>
class First
{
private:
int a;
};
template <class _B>
class Second
{
private:
int b;
};
我怎样才能将它们链接到多对多的友谊中。例如,在 First 中添加一个方法,该方法打印 Second 的参数对象的 b。
我的问题清楚了吗?
假设我有以下两个模板类:
template <class _A>
class First
{
private:
int a;
};
template <class _B>
class Second
{
private:
int b;
};
我怎样才能将它们链接到多对多的友谊中。例如,在 First 中添加一个方法,该方法打印 Second 的参数对象的 b。
我的问题清楚了吗?
template <typename T>
class First {
int a;
template<typename> friend class Second;
};
template <typename T>
class Second
{
int b;
template<typename> friend class First;
};
这将使everyFirst<T>
能够访问every 的内部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
在与特定实例化之前先声明模板,但这允许您仅将对类内部的访问权限授予特定实例化。
您可以从每个类的声明开始:
template< typename T > class First;
template< typename T > class Second;
现在两个类都将在其定义中了解另一个类。如果需要,您可以在那里声明他们为朋友。
template< typename T > class First
{
template< typename U> friend class Second;
};
反之亦然。
如果它们需要查看彼此的详细信息,您也可以在类定义下实现函数体,即它们不能使用“前向声明”副本。
假设您了解保护,是模板的问题前向声明:
#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);
}