2015-08-19 3 views
0

Я пытаюсь подключить OpenCV к C++ Builder (версия XE3).Ошибка переноса OpenExr (сторонняя сторона OpenCV) на 32-битный компилятор C++ Builder

Я столкнулся со многими ошибками компилятора.

Как я знаю, BCC 32-бит не является компилятором жалобы clang и не соответствует стандартам C++ 11. Вот почему я встретился с таким количеством вопросов.

Я попытался решить части этих вопросов один за другим с помощью обходных решений. Однако я не могу решить следующее. Может кто-нибудь мне помочь?

p.s. Я знаю, что это проблема с 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; 

ответ

0

Я не вижу, как это допустимый код в любом компиляторе pre-C++ 11. Вы пытаетесь определить специализированную реализацию шаблона для Box2iAttribute::writeValueTo(), но Box2iAttribute - это просто псевдоним для TypedAttribute<Imath::Box2i> и не может использоваться для квалификации реализации, как вы пытаетесь. И где параметр шаблона, который вы пытаетесь специализировать? Он не прикреплен к Box2iAttribute, он должен быть прикреплен к writeValueTo(). Но где конкретно объявлена ​​специализация? И тот факт, что компилятор жалуется на существующее тело, означает, что реализация TypedAttribute<Imath::Box2i>::writeValueTo() уже определена, поэтому вы не можете определить новую.

Возможно, C++ 11 допускает этот странный код, который объясняет, что VS и BCC64 принимают его. Но вы, конечно, не собираетесь принимать BCC32, чтобы принять его. Если вы хотите помочь портировать этот код в BCC32 или любой другой компилятор pre-C++ 11, вам нужно показать более полный пример, демонстрирующий именно то, что вы пытаетесь выполнить. То, что вы показали, не является полным. Пожалуйста, не просите людей скачивать внешние библиотеки, чтобы увидеть код. Опубликуйте соответствующие фрагменты здесь или создайте MCVE, демонстрируя те же концепции.

Смежные вопросы