Я получаю предупреждение о компиляции под Cygwin с помощью -std=c++11
:
cryptlib.cpp: In member function ‘virtual size_t PK_Signer::SignMessage(RandomNumberGenerator&, const byte*, size_t, byte*) const’:
cryptlib.cpp:770:41: warning: ‘auto_ptr’ is deprecated (declared at /usr/lib/gcc/x86_64-pc-cygwin/4.9.3/include/c++/backward/auto_ptr.h:87) [-Wdeprecated-declarations]
std::auto_ptr<PK_MessageAccumulator> m(NewSignatureAccumulator(rng));
^
Я попытался добавить:
#if defined(MYLIB_CXX11)
using auto_ptr = std::unique_ptr;
#else
using std::auto_ptr;
#endif
auto_ptr<PK_MessageAccumulator> m(NewSignatureAccumulator(rng));
Но это привело к следующему, даже с включенным <memory>
.
$ make cryptlib.o
c++ -std=c++11 -DNDEBUG -g2 -O3 -fPIC -march=native -DCRYPTOPP_DISABLE_ASM -Wall -Wextra -pipe -c cryptlib.cpp
cryptlib.cpp:770:27: error: no type named 'unique_ptr' in namespace 'std'
using auto_ptr = std::unique_ptr;
~~~~~^
Я также пробовал варианты следующего:
#if defined(MYLIB_CXX11)
typedef std::unique_ptr<T> local_ptr<T>;
#else
typedef std::auto_ptr local_ptr;
#endif
Я не могу сделать чистый переход на unique_ptr
, потому что это библиотека C++03, а в C++03 отсутствует unique_ptr
. И я не могу допустить, чтобы грязная компиляция продолжалась под C++11, потому что чистая компиляция — это ворота безопасности, а управление не позволит библиотеке пройти. (Об предупреждающих трюках не может быть и речи, потому что это должно быть простым, низко висящим фруктом. Предупреждающие трюки включают в себя отключение предупреждения).
Можно ли использовать "using
" для замены unique_ptr
? Или есть какой-то другой механизм?