BorlandDeveloperStudio2006 の C++Builder で vcl と ATL を混在するとコンパイルエラーが出る件
C++Builder6J で作りかけの DirectShow アプリを BorlandDeveloperStudio2006 にインポートするとコンパイルエラーが出て悩まされましたが、原因がわかったのでメモっておきます。
再現方法ですが、以下のようにコンソールアプリのプロジェクトを生成して、atlbase.h の include を追加します。
//--------------------------------------------------------------------------- #include#pragma hdrstop #include //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { return 0; } //---------------------------------------------------------------------------
これをコンパイルすると、以下のようなエラーが出ます。(プロジェクトオプションの C++コンパイラ(bcc32)->コンパイル で拡張コンパイルエラー情報を ON にしています)
[C++ エラー] atlbase.h(4569): E2015 '__stdcall VarCmp(tagVARIANT *,tagVARIANT *,unsigned long)' と 'Varutils::VarCmp' の区別が曖昧 詳細な解析情報 UnitMain.cpp(18): #include C:\Users\tomotaco-doga\tomotaco_work\svn-work\apps\ConcatenateMovie\Application\UnitMain.h UnitMain.h(23): #include c:\program files\borland\bds\4.0\include\atl/atlbase.h atlbase.h(292): namespace ATL atlbase.h(4233): class CComVariant atlbase.h(4640): 具体化対象の選択:bool CComVariant::operator <(const tagVARIANT &) const --- 具体化のため構文解析を初期化しました atlbase.h(4569): 構文解析対象:bool CComVariant::operator <(const tagVARIANT &) const
これの原因は atl/atlbase.h にあるようです。このヘッダで定義されている CComVariants クラスに以下のようなオペレータがありますが、
bool operator<(const VARIANT& varSrc) const {return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT)==VARCMP_LT;} bool operator>(const VARIANT& varSrc) const {return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT)==VARCMP_GT;}
これが oleauto.h で定義されている ::VarCmp() か vcl の VarUtils::VarCmp()のどちらを挿すのかがわからへん、というエラーです。
VarUtils::VarCmp() は今回のバージョンで追加された部分なので、C++Builder6J ではこの問題は起きません。
対策として、atl/atlbase.h の上記該当場所の VarCmp を ::VarCmp にして VarUtils 側を見ないようにすれば、コンパイルは通りました。
今回のバージョンから QualityCentral でバグレポートが出せるようなので報告してみようかと考えていますが、エラーメッセージを英訳せなあきませんね…。(コンパイル時のメッセージを英語にするようなオプションってありましたっけ…)
(21:11 追記) 適当に英訳して投稿してみました。(#25488) ちょっとドキドキ…。