在我继续使用模板的冒险中,我不仅在它所拥有的 ItemType 上对我的 Container 类进行了模板化,而且还在确定它应该如何对项目进行排序的 Functor 参数上进行了模板化。到目前为止,一切都很好。
当我想将一个 Container 的内容复制到另一个时,我遇到了一个小问题:如果两个 Container 具有不同的 Functor 类型,那么它们在技术上是不相关的类。因此,不允许容器 A 访问容器 B 的非公开内容。除了将我需要访问的所有内容都设为公开之外,有没有什么好的方法来处理这个问题?也许是某种模板“朋友”声明的方法?
演示问题的示例代码如下:
#include <stdio.h>
class FunctorA {};
class FunctorB {};
template <class ItemType, class Functor> class MyContainer
{
public:
MyContainer() : _metaData(0) {/* empty */}
template<class RHSFunctor> void CopyFrom(const MyContainer<ItemType, RHSFunctor> & copyFrom)
{
_metaData = copyFrom._metaData;
_item = copyFrom._item;
}
private:
int _metaData;
ItemType _item;
};
int main(int argc, char ** argv)
{
MyContainer<void *, FunctorA> containerA;
MyContainer<void *, FunctorB> containerB;
containerA.CopyFrom(containerB); // error, containerA::CopyFrom() can't access containerB's private data!
return 0;
}