0

我正在尝试将 OpenCV 移植到 C++ Builder(XE3 版本)。

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

据我所知,BCC 32 位不是 Clang 投诉编译器,也不遵循 C++11 标准。这就是我遇到这么多问题的原因。

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

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

以下代码摘自 ImfBoxAttribute.cpp(在 opencv 2.4.11\sources\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++ Builder XE3 32bit 编译时,遇到以下编译器错误:

[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;
4

1 回答 1

0

在任何 C++11 之前的编译器中,我看不出这是有效的代码。您正在尝试为 定义一个模板专用实现Box2iAttribute::writeValueTo(),但Box2iAttribute它只是一个别名,TypedAttribute<Imath::Box2i>不能像您尝试的那样用于限定实现。您要专门研究的模板参数在哪里?它不附加到Box2iAttribute,而是必须附加到writeValueTo()。但是专业化实际上是在哪里声明的呢?编译器抱怨现有主体的事实意味着TypedAttribute<Imath::Box2i>::writeValueTo()已经定义了一个实现,所以你不能定义一个新的。

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

于 2015-08-20T06:48:17.897 回答