Ошибка компиляции в режиме выпуска, но не в режиме отладки
Когда я компилирую на VS 2008 в режиме отладки все работает нормально. Когда я компилирую то же самое в режиме выпуска, не все работает. Насколько я могу судить, каталоги включения одинаковы и дополнительных символов препроцессора нет.
Любая помощь?
1> zlib.cpp 1> C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ include \ xutility (419): ошибка C2664: 'CryptoPP::AllocatorWithCleanup::AllocatorWithCleanup(const CryptoPP::AllocatorWithCleanup &)': невозможно преобразовать параметр 1 из 'CryptoPP::AllocatorWithCleanup' в 'const CryptoPP::AllocatorWithCleanup &' 1> с 1> [1>
T = std:: _ Aux_cont 1>] 1>
и 1> [1>
T = CryptoPP:: HuffmanDecoder:: CodeInfo 1>] 1> и 1> [1> T = std:: _ Aux_cont 1>
] 1> Причина: невозможно преобразовать из 'CryptoPP::AllocatorWithCleanup' в 'const CryptoPP::AllocatorWithCleanup' 1> с 1> [1>
T = CryptoPP:: HuffmanDecoder:: CodeInfo 1>] 1> и 1> [1> T = std:: _ Aux_cont 1>
] 1> Нет доступного пользовательского оператора преобразования, который может выполнить это преобразование, или оператор не может быть вызван 1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility(417): при компиляции функция-член шаблона класса 'std:: _ Container_base_aux_alloc_real<_Alloc>:: _ Container_base_aux_alloc_real (_Alloc)' 1> с 1> [1>
_Alloc = CryptoPP:: AllocatorWithCleanup 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ include \ vector (421): см. Ссылку на создание экземпляра шаблона класса 'std:: _ Container_base_aux_alloc_real<_Alloc>' составлено 1> с 1>
[1>
_Alloc = CryptoPP:: AllocatorWithCleanup 1>] 1> C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ include \ vector (439): см. Ссылку на создание экземпляра шаблона класса 'std::_Vector_val<_Ty, _Alloc>компилируется 1> с 1> [1> _Ty = CryptoPP:: HuffmanDecoder:: CodeInfo, 1>
_Alloc = CryptoPP:: AllocatorWithCleanup 1>] 1>
C: \ myproject \ sshlib \ zinflate.h (79): см. Ссылку на создание шаблона класса 'std:: vector<_Ty, _Ax>', компилируемого 1> с 1>
[1>
_Ty = CryptoPP:: HuffmanDecoder:: CodeInfo, 1>
_Ax = CryptoPP:: AllocatorWithCleanup 1>] 1> zinflate.cpp
Строка кода, на которую он в конечном итоге указывает:
std::vector<CodeInfo, AllocatorWithCleanup<CodeInfo> > m_codeToValue;
Изменить: Больше информации:
Я получаю эту ошибку именно тогда, когда мой препроцессор содержит NDEBUG вместо _DEBUG. Если я изменю конфигурацию выпуска, чтобы _DEBUG вместо нее, она компилировалась. Зачем?
2 ответа
Это ошибка в компиляторе Visual C++. См. http://old.nabble.com/-jira--Created%3A-%28QPID-1458%29-C%2B%2B-common-compile-error-in-VC9-Release-mode-td20469700.html.
Вы можете обойти это, отключив проверенные итераторы:
#define _SECURE_SCL 0
Но будьте осторожны: если вы ссылаетесь на стороннюю библиотеку, которая была скомпилирована с _SECURE_SCL
включен, например, повышение, повреждение памяти может (и будет) происходить.
Возвращаясь к C++ спустя много лет, я столкнулся с похожей ошибкой. Оказалось, что это не имеет ничего общего с этой ошибкой и связано с тем, что я не обновил свою конфигурацию выпуска до тех же параметров, которые использовались в конфигурации отладки! Так что для других новичков - не забудьте убедиться, что у вас есть одинаковые наборы символов, поддержка CLR, включение каталогов, дополнительные зависимости и т. Д. Во всех ваших конфигурациях.