2015-08-04 16 views
3

У меня здесь странная ситуация. Я пытаюсь использовать библиотеку криптонов Botan с VS2015 (потому что в некоторых других частях проекта используется тяжелый код C++ 11, который VS2013 не может скомпилировать), и я получаю довольно длинную ошибку компиляции (см. Ниже).Ошибка компиляции Botan VS2015

После опроса различных вещей я пришел к выводу, что даже если один из заголовков ботанов включен в скомпилированный исходный файл C++, компилятор будет выдать ошибку ниже. Сейчас у меня есть одну строку в файле:

#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. 

Так как я был в состоянии собрать и запустить Ботан тесты, у меня есть ощущение, что Я что-то пропустил, но понятия не имею, что. Кто-нибудь имеет опыт с этим? (BTW: Тот же самый код компилируется приятно с г ++ 4.9)

+0

'станд :: _ Wrap_alloc <Ботан :: secure_allocator >» на 'сопзЬ Ботан :: secure_allocator <_Newfirst> &' ': может быть принят 'станд :: _ Wrap_alloc' объект требует inderection как' '* оператора, чтобы получить' Botan :: secure_allocator 'объект, который, вероятно, можно преобразовать в' Botan :: secure_allocator <_Newfirst> '? –

+1

Может быть, отсутствует include (чтобы разрешить преобразование 'Botan :: secure_allocator')? – Jarod42

+0

Я добавил еще одно возможное обходное решение для ответа. – bogdan

ответ

5

Глядя на sources, кажется, что Botan::secure_allocator не предоставляет шаблон конструктор формы

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

Это требуется Стандартом. В текущем рабочем черновике N4527 соответствующие биты указаны в [17.6.3.5]. Таблица 28 - Требования к распределителю; также полезен пример в параграфе 9.

Таким образом, мы не можем обвинять стандартную реализацию библиотеки, которая поставляется с VC 14, для этого требуется для компиляции. Ошибка, по моему мнению, на стороне Ботана.


Быстрое исправление добавить такое определение Botan::secure_allocator:

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

С конкретизацией этого шаблона распределителя не имеет какие-либо не-статические элементов данных, пустое тело должно быть в порядке. Тем не менее, я не знаком с библиотекой, и мы говорим о криптографии здесь, поэтому, прежде чем использовать это, чтобы сделать какие-либо серьезные вещи, пожалуйста, подтвердите это изменение с помощью авторов библиотеки.


Другой возможный обходной путь:

Я заметил, что код, который вызывает конструктор смешанного типа, кажется, активируется только при отладке итератор включена, что происходит по умолчанию в режиме отладки.

Вы пытались скомпилировать в режиме выпуска? Если мои наблюдения верны, вы больше не получите эту ошибку, так как дополнительное оборудование для отладки итератора будет отключено.

Чтобы получить такое же поведение в режиме отладки, установите макрос _ITERATOR_DEBUG_LEVEL на 0 глобально.

Отладочные итераторы могут быть полезны для обнаружения ошибок (до тех пор, пока удар по производительности не повлияет на вас), поэтому я не буду использовать это как постоянное исправление, но это может быть полезно в качестве временного обходного пути, если вы Не хотите изменять заголовочный файл Botan.

Это также может объяснить, почему вы смогли скомпилировать тесты: возможно, они скомпилированы в режиме деблокирования или, во всяком случае, с комбинацией настроек, которая отключает отладку итератора?

+0

Я правильно понимаю, что вы предлагаете добавить явный конструктор копирования? Это объясняет ошибку, потому что другие компиляторы делают это неявно. –

+0

@SimonWarta Это не конструктор копирования. Конструкторы копирования не могут быть специализированными шаблонами, и их первый параметр должен быть ссылкой lvalue на построенный тип (тот, который я описал, может принимать любую другую специализацию шаблона 'secure_allocator'). Насколько я знаю, VC 14 делает все правильно, когда дело доходит до неявного создания специальных функций-членов, так что это не проблема. По-разному поведение, по-видимому, вызвано отладкой итератора в STL VC14, но это все еще не делает стандартного совместимого распределителя - этот конструктор шаблонов требуется. – bogdan

+0

Не могли бы вы добавить свое изменение вместе с справочной информацией в качестве запроса на тягу к Ботану, пожалуйста? Там мы можем получить отзывы от некоторых других разработчиков. Я не эксперт, когда дело доходит до шаблонов. –

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