Я получаю много ошибок в STL (set, vector, deque и т. д.), где используется макрос _NOEXCEPT_PO
. Тот же код прекрасно компилируется в Visual Studio 2010, STL которого не включает _NOEXCEPT_PO
макросов. Я воспроизвел эту ошибку на трех компьютерах. Существуют ли дополнительные определения preproc, о которых мне нужно знать?
Указана ошибка:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\vector:852: предупреждение: C4346: 'std::vector‹_Ty,_Alloc>::std::vector‹_Ty,_Alloc>::_Alty ::propagate_on_container_move_assignment::value': зависимое имя не является типом
_Myt& operator=(_Myt&& _Right)
_NOEXCEPT_OP(_Alty::propagate_on_container_move_assignment::value
|| _Alty::is_always_equal::value)
{ // assign by moving _Right
if (this != &_Right)
{ // different, assign it
_Tidy();
if (_Alty::propagate_on_container_move_assignment::value
&& this->_Getal() != _Right._Getal())
this->_Move_alloc(_Right._Getal());
_Assign_rv(_STD forward<_Myt>(_Right));
}
return (*this);
}
_NOEXCEPT_OP
определяется как:
#define _NOEXCEPT noexcept
#define _NOEXCEPT_OP(x) noexcept(x)
Изменить:
Работая над тем, чтобы сократить это до небольшого примера, я обнаружил, что именно включение заголовков Juce имело значение. К сожалению, сообщение об ошибке было не очень полезным, поэтому я не понял, что включение Juce было уместным.
Исправление этой конкретной проблемы заключается в определении: JUCE_COMPILER_SUPPORTS_NOEXCEPT=1
value
— этоbool
, а не тип, и это совершенно нормально.typename
на самом деле сломает его. Но я понимаю, откуда вы пришли — у них также есть расширение, делающееtypename
необязательным. - person Quentin   schedule 07.10.2017