0

OpenCV を C++ Builder (XE3 バージョン) に移植しようとしています。

多くのコンパイラ エラーに遭遇しました。

私が知っているように、BCC 32 ビットは clang 準拠のコンパイラではなく、C++11 標準に従っていません。だからこそ、私はこれまで多くの問題に直面してきました。

これらの問題の一部を回避策で 1 つずつ解決しようとしました。ただし、次の問題は解決できません。誰かがこれについて私を助けることができますか?

ps このコードは Visual Studio または BCC64 コンパイラでも正常にコンパイルできるため、BCC32 の問題であることはわかっています。

次のコードは、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 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;
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 に答える