4

ここで奇妙な状況があります。VS2015 で Botan 暗号ライブラリを使用しようとしています (プロジェクトの他の部分では、VS2013 ではコンパイルできない重い C++11 コードを使用しているため)、かなり長いコンパイル エラーが発生します (以下を参照)。

いろいろ試した結果、コンパイル済みのC++ソースファイルにボタンヘッダーが1つでも含まれていても、コンパイラーは以下のエラーをスローするという結論に達しました。現在、ファイルには次の1行があります。

#include <botan/botan.h>

これは私が得るエラーです:

    C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\xmemory0(876): error C2664: 'Botan::secure_allocator<_Newfirst>::secure_allocator(const Botan::secure_allocator<_Newfirst> &)': cannot convert
argument 1 from 'std::_Wrap_alloc<Botan::secure_allocator<Botan::byte>>' to 'const Botan::secure_allocator<_Newfirst> &'
        with
        [
            _Newfirst=std::_Container_proxy
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\xmemory0(876): note: Reason: cannot convert from 'std::_Wrap_alloc<Botan::secure_allocator<Botan::byte>>' to 'const Botan::secure_allocator<_Ne
wfirst>'
        with
        [
            _Newfirst=std::_Container_proxy
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\xmemory0(876): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(587): note: see reference to function template instantiation 'std::_Wrap_alloc<Botan::secure_allocator<_Newfirst>>::_Wrap_alloc<std::_Wr
ap_alloc<Botan::secure_allocator<Botan::byte>>>(_Other &) noexcept' being compiled
        with
        [
            _Newfirst=std::_Container_proxy,
            _Other=std::_Wrap_alloc<Botan::secure_allocator<Botan::byte>>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(587): note: see reference to function template instantiation 'std::_Wrap_alloc<Botan::secure_allocator<_Newfirst>>::_Wrap_alloc<std::_Wr
ap_alloc<Botan::secure_allocator<Botan::byte>>>(_Other &) noexcept' being compiled
        with
        [
            _Newfirst=std::_Container_proxy,
            _Other=std::_Wrap_alloc<Botan::secure_allocator<Botan::byte>>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(585): note: while compiling class template member function 'void std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(void)
'
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator<Botan::byte>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(552): note: see reference to function template instantiation 'void std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>::_Free_proxy(voi
d)' being compiled
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator<Botan::byte>
        ]
C:\Program Files\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(679): note: see reference to class template instantiation 'std::_Vector_alloc<std::_Vec_base_types<_Ty,_Alloc>>' being compiled
        with
        [
            _Ty=Botan::byte,
            _Alloc=Botan::secure_allocator<Botan::byte>
        ]
c:\Botan\include\botan-1.11\botan/rng.h(43): note: see reference to class template instantiation 'std::vector<Botan::byte,Botan::secure_allocator<Botan::byte>>' being compiled
NMAKE : fatal error U1077: 'C:\PROGRA~1\MICROS~3.0\VC\bin\cl.exe' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.

ボタンテストをコンパイルして実行できたので、何かを見逃したような気がしますが、何が原因かわかりません。誰もこれについて経験がありますか?(ところで: 同じコードは g++ 4.9 でうまくコンパイルされます)

4

1 に答える 1

6

sourcesを見るとBotan::secure_allocator、フォームのテンプレートコンストラクターが提供されていないようです

template<class U> secure_allocator(const secure_allocator<U>& other);

これは、規格で要求されています。現在のワーキング ドラフトN4527では、関連するビットは [17.6.3.5] にあります。パラグラフ 9 の例も役に立ちます。

したがって、VC 14 に付属する標準ライブラリの実装が、コンパイルのためにこれを要求することを非難することはできません。私の意見では、エラーはぼたんの側にあります。


簡単な修正は、そのような定義を に追加することBotan::secure_allocatorです:

template<class U> secure_allocator(const secure_allocator<U>&) BOTAN_NOEXCEPT { }

このアロケーター テンプレートのインスタンス化には非静的データ メンバーがないため、空の本体で問題ありません。ただし、私はライブラリに詳しくなく、ここでは暗号化について話しているため、これを使用して深刻なことを行う前に、ライブラリの作成者に変更を確認してください。


別の可能な回避策:

混合型コンストラクターを呼び出すコードは、イテレーターのデバッグが有効になっている場合にのみ有効に見えることに気付きました。これは、デバッグ モードでデフォルトで発生します。

リリースモードでコンパイルしてみましたか? 私の観察が正しければ、イテレータのデバッグ用の追加の機構が無効になるため、このエラーは発生しなくなります。

デバッグ モードで同じ動作を得るには、_ITERATOR_DEBUG_LEVELマクロを0グローバルに設定します。

デバッグ イテレータはエラーを検出するのに役立ちます (パフォーマンス ヒットが影響しない限り)。そのため、これを永続的な修正として使用することはしませんが、一時的な回避策として使用したくない場合に役立つ可能性があります。 Botan ヘッダー ファイルを変更します。

これは、テストをコンパイルできた理由も説明できます。リリース モードでコンパイルされているか、イテレータのデバッグを無効にする設定の組み合わせでコンパイルされている可能性があります。

于 2015-08-04T09:36:38.993 に答える