2015-08-19 68 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