【发布时间】:2010-11-14 14:02:02
【问题描述】:
在我对模板的持续探索中,我不仅在它所拥有的 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;
}
【问题讨论】:
-
澄清标题以反映您无法实例化类但可以实例化类模板。混淆的部分原因在于类模板本身不是类型,但每个实例化都是不同的类型。
标签: c++ templates private public