Visual c + + 6.0中的cvblob编译错误

时间:2010-10-13 15:21:04

标签: c++ visual-studio visual-c++ compiler-construction opencv

我正在使用Microsoft Visual C ++ 6.0和Microsoft Visual Studio 2008来开发学术计算机视觉项目。

在这个项目中,我需要使用OpenCV 1.1(http://opencv.willowgarage.com/)和CvBlob(http://code.google.com/p/cvblob/)。

我尝试使用Microsoft Visual Studio 2008编译此项目,并且编译时没有错误。

使用Visual C ++ 6.0,我遇到了很多错误。

OpenCV不对此行为负责,因为只有OpenCV(没有CvBlob)的普通项目效果很好。

为了更好地理解错误,我创建了一个仅包含CvBlob的空项目。

我在这里粘贴错误的简短摘要:

cvcontour.cpp(253) : error C2371: 'i' : redefinition; different basic types (and others similar to this. i solved with variable redefinition, every time)

cvcontour.cpp(318) : error C2664: 'thiscall std::vector<struct CvPoint,class std::allocator<struct CvPoint> >::std::vector<struct CvPoint,class std::allocator<struct CvPoint> >(unsigned int,const struct CvPoint &,const class std::allocator<struct CvPoint> &)' : cannot convert parameter 1 from 'class std::deque<struct CvPoint,class std::allocator<struct CvPoint> >::iterator' to 'unsigned int' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

cvtrack.cpp(278) : error C2440: 'initializing' : cannot convert from 'struct cvb::CvTrack *const ' to 'struct cvb::CvBlob *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

您对如何解决这些问题有什么想法?

提前感谢您的帮助!

--------更新--------

我尝试编辑并更正代码,以便消除我的问题中的三个错误。

错误C2664似乎更难以实现......

我已经取代了被起诉的行

return new CvContourPolygon(dq.begin(), dq.end());

其中CvContourPolygon是typedef std::vector<CvPoint> CvContourPolygon;

deque<int>::iterator dq_it;dq_it = dq.begin();
CvContourPolygon v_tmp;
v_tmp.push_back(*dq_it);
while (dq_it != dq.end()){
  v_tmp.push_back(*dq_it++);
}

首先,我写的是正确的吗?那么,我怎样才能解决这个错误呢?

提前谢谢!

错误(假设第一行是318:

cvcontour.cpp(319) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class std::deque<struct CvPoint,class std::allocator<struct CvPoint> >::iterator' (or 
there is no acceptable conversion)
cvcontour.cpp(321) : error C2664: 'push_back' : cannot convert parameter 1 from 'int' to 'const struct CvPoint &'
    Reason: cannot convert from 'int' to 'const struct CvPoint'
    No constructor could take the source type, or constructor overload resolution was ambiguous
cvcontour.cpp(322) : error C2679: binary '!=' : no operator defined which takes a right-hand operand of type 'class std::deque<struct CvPoint,class std::allocator<struct CvPoint> >::iterator' (or there is no acceptable conversion)
cvcontour.cpp(322) : fatal error C1903: unable to recover from previous error(s); stopping compilation

执行cl.exe时出错。

-------- UPDATE2 --------

此代码似乎正常运行!

deque<CvPoint>::iterator dq_it;
dq_it = dq.begin();
CvContourPolygon v_tmp;
for (dq_it = dq.begin(); dq_it != dq.end(); ++dq_it){
  v_tmp.push_back(*dq_it);
}
//return new CvContourPolygon(dq.begin(), dq.end());
return &v_tmp;

1 个答案:

答案 0 :(得分:3)

C2371 - VC6很邋with,局部变量范围很广。应该能够通过使代码明确地使用变量名来解决这个问题。

C2664 - 看起来无法使用deque迭代器初始化向量 - 调用vector :: vector()时出现错误的重载?可能必须通过以某种方式手动将deque元素复制到新的向量来解决这个问题。

C2440 - 检查对象是否兼容(VS2008似乎这么认为)并添加适当的强制转换。

编辑: 你的代码不应该是这样的吗?

deque<CVPoint>::iterator dq_it;dq_it = dq.begin();
CvContourPolygon v_tmp;
for (dq_it = dq.begin(); dq_it != dq.end(); ++dq_it)
{
  v_tmp.push_back(*dq_it);
}