Я недавно обновил версию Boost, которую я использую, с 1.59 до 1.68. Кроме того, я также обновил версию Visual Studio, которую я использую, с 2015 по 2017 год. После этих изменений не удается скомпилировать приведенный ниже шаблон класса, который используется для удаления константности, изменчивости и ссылочности.
// Class for removing constness, volatileness and referenceness
template<typename T>
struct Cleaner
{
// Part1: Remove referenceness and constness at the highest level
typedef
typename boost::remove_cv<
typename boost::remove_reference<typename T>::type
>::type
CleanPart1;
// Part2: If pointer, remove the const under the pointer and re-add the pointer
typedef typename
typename boost::mpl::if_c< !boost::is_pointer< CleanPart1 >::value,
typename CleanPart1,
typename boost::add_pointer<
typename boost::remove_cv<
typename boost::remove_pointer<CleanPart1>::type
>::type
>::type
>::type
CleanPart2;
// Store final clean type
typedef CleanPart2 Type;
};
Указанный шаблон класса можно использовать следующим образом в шаблоне функции, который получает параметр шаблона T
:
typedef typename Cleaner<T>::Type CleanT;
Ошибки компиляции, отображаемые в Visual Studio, весьма загадочны:
error C2143: syntax error: missing ';' before '<'
note: see reference to class template instantiation 'Cleaner<T>'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
error C3646: 'Type': unknown override specifier
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Я давно изучаю этот код и не могу найти причину, по которой он не компилируется. Все выглядит правильно для меня. Кто-нибудь видит, чего мне не хватает?