0

(这个问题对任何愿意尝试的人都有好处)

嗨,我已经定义了以容器类为参数的重载模板函数

(这里 CntrlCls1 = RWTValOrderedVector和 CntrlCls2 = RWTPtrSortedVector

template<Class X> void func(CntrCls1<X>* ){}

template<Class X> void func(CntrCls1<X*>* ){}

template<Class X> void func(CntrCls2<X>*){}

定义后我调用函数如下

func(&ABC);

其中 ABC 是CntrCls1<*>类型的实例(即它是一个指针容器)

现在这在我的计算机上编译得很好,但是当我在不同的系统上编译时,由于某种原因,编译器试图用 CntrlCls2 参数实例化函数模板,结果给出错误。

CtrCls1 和 CtrCls2 是不相关的容器。

更新:我正在使用 VS 2008 在两个系统上进行构建,所以这应该不是问题。

Update1:​​我在用 CtrCls2 参数注释掉函数模板后尝试重新编译现在编译正在尝试实例化第一个函数(即没有指针):-(

4

1 回答 1

0

1) 检查安装的 VS 2008 的服务包。编译器版本在机器上可能会有所不同,从而导致不同的结果。

2) 尝试在模板声明中使用“typename”关键字而不是“class”。

顺便说一下。从代码中我看到您正在使用指针来获取已排序容器的值。已排序的容器希望找到类似的比较

template<T> bool operator<(const T&left, const T&right);

由于 RWTValOrderedVector 和 RWTPtrSortedVector 看起来像是包含有序排序值的容器,因此它们应该使用这种比较运算符。但是,对于指针类型 operator< 函数比较它们的地址,而不是它们指向的对象。因此,将指针存储在有序容器中将为您提供已排序的指针集,而不是指向已排序对象的指针集。仅供参考。

于 2011-02-12T09:11:49.097 回答