Я пытаюсь портировать OpenCV на C ++ Builder (версия XE3).
Я столкнулся со многими ошибками компилятора.
Как я знаю, 32-битный BCC не является компилятором жалоб clang и не соответствует стандартам C ++ 11. Вот почему я встретил так много вопросов.
Я пытался решить части этих проблем один за другим с обходными путями. Тем не менее, я не могу решить следующее. Может кто-нибудь помочь мне об этом?
постскриптум Я знаю, что это проблема с 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;
Я не вижу, насколько это допустимый код, в любом компиляторе до C ++ 11. Вы пытаетесь определить шаблон специализированной реализации для Box2iAttribute::writeValueTo()
, но Box2iAttribute
это просто псевдоним для TypedAttribute<Imath::Box2i>
и не может использоваться для квалификации реализации, как вы пытаетесь. А где параметр шаблона, который вы пытаетесь специализировать? Он не привязан к Box2iAttribute
, это должно быть привязано к writeValueTo()
вместо. Но где на самом деле заявлена специализация? И тот факт, что компилятор жалуется на существующее тело, означает, что TypedAttribute<Imath::Box2i>::writeValueTo()
реализация уже определена, поэтому вы не можете определить новую.
Возможно, C ++ 11 допускает этот странный код, который объясняет, как VS и BCC64 принимают его. Но вы, конечно, не получите BCC32, чтобы принять его. Если вам нужна помощь в переносе этого кода на BCC32 или любой другой компилятор до C ++ 11, вам нужно показать более полный пример, демонстрирующий, что именно вы пытаетесь достичь. То, что вы показали, не завершено. Пожалуйста, не просите людей скачивать внешние библиотеки только для просмотра кода. Разместите соответствующие части здесь или создайте MCVE демонстрируя те же понятия.