OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 5148|回复: 5

ccs3.3下,用cvSeqPartition,编译不能通过,报函数指针不一致

[复制链接]
发表于 2008-12-10 17:57:48 | 显示全部楼层 |阅读模式
用cvSeqPartition的时候,指定比较函数,编译通不过,
error: argument of type "int (*)(const void *, const void *, void *)" is incompatible with parameter of type "CvCmpFunc"
CvCmpFunc的定义就是int (*)(const void *, const void *, void *),有点搞不懂了

程序在VC下编译是没有问题的,不知道是什么原因,望指教
回复

使用道具 举报

 楼主| 发表于 2008-12-10 18:08:21 | 显示全部楼层

ccs3.3下,用cvSeqPartition,编译不能通过,报函数指针不一致

解决了,用(CvCmpFunc)强制转型,但是原因还是不明白
回复 支持 反对

使用道具 举报

发表于 2008-12-11 19:20:47 | 显示全部楼层

ccs3.3下,用cvSeqPartition,编译不能通过,报函数指针不一致

解决了,用(CvCmpFunc)强制转型,但是原因还是不明白

C++写给C调用的函数声明如下:
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. int CvCmpFunc(...);
  5. #ifdef __cplusplus
  6. }
  7. #endif
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-16 13:56:20 | 显示全部楼层

ccs3.3下,用cvSeqPartition,编译不能通过,报函数指针不一致

CvCmpFunc函数指针类型的定义是在cxcore.h里的,有关于extern “C”的说明。
调用部分,和CvCmpFunc的定义实现部分都是在同一个cpp文件里的。
原因还是不懂哈。
[quote="balance":1mziebjf]解决了,用(CvCmpFunc)强制转型,但是原因还是不明白

C++写给C调用的函数声明如下:
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. int CvCmpFunc(...);
  5. #ifdef __cplusplus
  6. }
  7. #endif
复制代码
[/quote:1mziebjf]
回复 支持 反对

使用道具 举报

发表于 2008-12-17 09:27:11 | 显示全部楼层

ccs3.3下,用cvSeqPartition,编译不能通过,报函数指针不一致

CvCmpFunc函数指针类型的定义是在cxcore.h里的,有关于extern “C”的说明。
调用部分,和CvCmpFunc的定义实现部分都是在同一个cpp文件里的。
原因还是不懂哈。

[quote="chai2010":qg4i7dhw][quote="balance":qg4i7dhw]解决了,用(CvCmpFunc)强制转型,但是原因还是不明白

C++写给C调用的函数声明如下:
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. int CvCmpFunc(...);
  5. #ifdef __cplusplus
  6. }
  7. #endif
复制代码
[/quote:qg4i7dhw][/quote:qg4i7dhw]

你把示意代码贴出来, 代码尽量短
回复 支持 反对

使用道具 举报

发表于 2008-12-17 21:11:37 | 显示全部楼层

ccs3.3下,用cvSeqPartition,编译不能通过,报函数指针不一致

照你所说,函数CvCmpFunc的定义在cpp文件中,定义部分又没有加任何的前导修饰符,也就是说编译器实际是按照C++规范去处理该函数的token的,而你在头文件中又在该函数的声明前后加了extern "C" {},那么在该cpp中,如果CvCmpFunc函数定义在调用之后的话,编译器在该函数的调用点上看到的函数原型就是一个ANSI C规范的CvCmpFunc,在C规范和C++规范下,同一个token的目标符号名是不同的,最直接的原因就是C++要支持函数重载,自然会报错。
你可以试以下三种方法:
1、在cpp中将CvCmpFunc函数定义提前到调用点之前
2、将头文件中的该函数原型声明拿到extern “C”之外
3、在cpp中该函数的定义前加上extern "C"

你那强制转换只是骗了编译器而已,也不失为一种方法。
CvCmpFunc函数指针类型的定义是在cxcore.h里的,有关于extern “C”的说明。
调用部分,和CvCmpFunc的定义实现部分都是在同一个cpp文件里的。
原因还是不懂哈。

[quote="chai2010":3b59s77l][quote="balance":3b59s77l]解决了,用(CvCmpFunc)强制转型,但是原因还是不明白

C++写给C调用的函数声明如下:
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. int CvCmpFunc(...);
  5. #ifdef __cplusplus
  6. }
  7. #endif
复制代码
[/quote:3b59s77l][/quote:3b59s77l]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-26 06:23 , Processed in 0.009254 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表