使用模板函数时出现不一致错误

发布于 2024-10-16 00:30:43 字数 967 浏览 2 评论 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 参数注释掉函数模板后重新编译现在编译正在尝试实例化第一个函数(即没有指针):-(

(This question has bounty for anyone willing to take a shot)

Hi I have defined overloading template function with container class as arguments

(Here CntrlCls1 = RWTValOrderedVector and CntrlCls2 = RWTPtrSortedVector)

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

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

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

After defining I am calling function as following

func(&ABC);

where ABC is instance of type CntrCls1<*> (i.e. it is a container of pointers)

Now this is compiling just fine on my computer, but when I compile on a different system, for some reason the compiler is trying to instantiate function template with CntrlCls2 parameter, and as a result giving error.

CtrCls1 and CtrCls2 are unrelated containers.

Update: I am using the VS 2008 to build on both the systems so that shouldn't be a problem.

Update1: I tried to recompile after commenting out function template with CtrCls2 parameter Now the compile is trying to instantiate the first function ( i.e. without pointers) :-(

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱已欠费 2024-10-23 00:30:43

1) 检查已安装的 VS 2008 的 Service Pack。编译器版本可能因机器而异,从而导致不同的结果。

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

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

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

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

1) Check Service Packs for the VS 2008 installed. Compilator versions can differ on machies, causing different results.

2) Try to use a "typename" keyword instead of "class" in template declaration.

And by the way. From the code i see you're using pointers for values of the sorted container. Sorted containers expects to find the comparison like

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

Since RWTValOrderedVector and RWTPtrSortedVector looks like containers that contains values in sorted orded they should use such comparison operator. BUT, for pointer types operator< function compares their adresses, not the object they point.
So storing pointers in ordered container will give you sorted pointers set, not the set of the pointers to sorted objects.
Just FYI.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文