Я использую Visual C ++ 2010, и вот мой фрагмент кода:
std::set<int> s;
decltype(s)::value_type param = 0;
Я получил следующее сообщение об ошибке, кто-нибудь может мне помочь?
> error C2039: 'value_type' : is not a member of '`global namespace''
> error C2146: syntax error : missing ';' before identifier 'param'
Это ошибка Visual Studio, которая была обнаружена в прошлом году на Connect. это выпуск 757545 («Невозможно использовать decltype перед оператором области»).
Проблема имеет обходной путь, указанный рядом с ним, который фактически совпадает с @ iammillind, за исключением того, что он использует std::identity
это было удалено из <functional>
незадолго до публикации C ++ 11 по любой причине. (std::common_type
с одним шаблоном параметр эквивалентен; std::remove_reference
то же самое в некоторых случаях.)
Я вижу, что с версией g ++ 4.7.2 код компилируется нормально. Так что это может быть ошибка компилятора в MSVS.
На данный момент вы можете попробовать следующий трюк:
#ifdef COMPILER_BUG_STILL_THERE
template<typename T> struct Get { typedef T type; };
#define DECLTYPE(VAR) Get<decltype(VAR)>::type
#else
#define DECLTYPE(VAR) decltype(VAR)
#endif
Используйте это как:
DECLTYPE(s)::value_type param = 0;
отказ: Конечно, с этим трюком, возможно, вам придется использовать typename
когда внутри шаблонов. Для этого вы можете иметь еще 1 макрос, такой как #define TDECLTYPE(VAR) typename DECLTYPE(VAR)