(这个问题对任何愿意拍摄的人都有好处)
您好我已经使用容器类作为参数
定义了重载模板函数(此处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&lt; *&gt; 类型的实例(即它是指针的容器)
现在这在我的计算机上编译得很好,但是当我在另一个系统上编译时,由于某种原因,编译器试图用CntrlCls2参数实例化函数模板,结果给出了错误。
CtrCls1和CtrCls2是不相关的容器。
更新:我正在使用VS 2008来构建这两个系统,这应该不是问题。
Update1:我在用CtrCls2参数注释掉函数模板后尝试重新编译现在编译试图实例化第一个函数(即没有指针): - (
答案 0 :(得分:0)
1)检查已安装的VS 2008的Service Pack。 Compilator版本可能因机器而异,导致不同的结果。
2)尝试在模板声明中使用“typename”关键字而不是“class”。
顺便说一下。从代码中我看到你正在使用已排序容器的值的指针。排序容器希望找到比较
template<T> bool operator<(const T&left, const T&right);
由于RWTValOrderedVector和RWTPtrSortedVector看起来像包含已排序的值的容器,因此应使用此类比较运算符。但是,对于指针类型运算符&lt;函数比较它们的地址,而不是它们指向的对象。 因此,在有序容器中存储指针将为您提供已排序的指针集,而不是指向已排序对象的指针集。 仅供参考。