2015-08-19 40 views
0

我试图将OpenCV移植到C++ Builder(XE3版本)。问题将OpenExr(OpenCV的第三方)移植到C++ Builder 32位编译器

我遇到了很多编译器错误。

据我所知,BCC 32位不是一个铿锵的抱怨编译器,并不遵循C++ 11标准。这就是我遇到这么多问题的原因。

我试图用解决方法一个接一个地解决这些问题的一部分。但是,我无法解决以下问题。有人可以帮我解决这个问题吗?

p.s.我知道这是BCC32的一个问题,因为可以使用Visual Studio甚至BCC64编译器成功编译此代码。

下面的代码是从ImfBoxAttribute.cpp萃取(在OpenCV中2.4.11 \源\的3rdParty \的OpenEXR \ IlmImf)

template <> 
void 
Box2iAttribute::writeValueTo (OStream &os, int) const 
{ 
    Xdr::write <StreamIO> (os, _value.min.x); 
    Xdr::write <StreamIO> (os, _value.min.y); 
    Xdr::write <StreamIO> (os, _value.max.x); 
    Xdr::write <StreamIO> (os, _value.max.y); 
} 

当我与C++生成器XE3 32位编译,我用下面的编译器满足错误:

[bcc32 Error] ImfBoxAttribute.cpp(61): E2171 Body has already been defined for function 'Box2iAttribute::writeValueTo(OStream &,int) const' 

[bcc32 Error] ImfBoxAttribute.cpp(62): E2451 Undefined symbol 'os' 
    Full parser context 
    ImfBoxAttribute.cpp(47): namespace Imf 
    ImfBoxAttribute.cpp(61): parsing: void Box2iAttribute::writeValueTo(OStream &,int) const 

这里是Box2iAttribute的定义:

typedef TypedAttribute<Imath::Box2i> Box2iAttribute; 
typedef Box <V2i> Box2i; 

回答

0

我不明白在任何C++ 11之前的编译器中这是否是有效的代码。您正在尝试为Box2iAttribute::writeValueTo()定义模板专用实现,但Box2iAttribute只是TypedAttribute<Imath::Box2i>的别名,不能用于像您尝试的那样限定实现。你试图专注于哪个模板参数?它不附加到Box2iAttribute,它将不得不附加到writeValueTo()。但是专业化究竟在哪里宣布?而编译器正在抱怨现有的机构的事实意味着TypedAttribute<Imath::Box2i>::writeValueTo()实现已经被定义,所以你不能定义一个新的。

也许C++ 11允许这个奇怪的代码,这将解释VS和BCC64接受它。但是你肯定不会让BCC32接受它。如果您需要帮助将此代码移植到BCC32或任何其他C++ 11之前的编译器,则需要展示一个更完整的示例,以说明您正在尝试完成的内容。你所展示的不完整。请不要让人们去下载外部库来查看代码。在这里发布相关的作品,或创建一个展示相同概念的MCVE