Ошибка компилятора C ++ 11 при использовании decltype (var), за которым следует внутренний тип & quot; var & quot;

Я использую 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'

8

Решение

Это ошибка Visual Studio, которая была обнаружена в прошлом году на Connect. это выпуск 757545 («Невозможно использовать decltype перед оператором области»).

Проблема имеет обходной путь, указанный рядом с ним, который фактически совпадает с @ iammillind, за исключением того, что он использует std::identity это было удалено из <functional> незадолго до публикации C ++ 11 по любой причине. (std::common_type с одним шаблоном параметр эквивалентен; std::remove_reference то же самое в некоторых случаях.)

7

Другие решения

Я вижу, что с версией 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)

4

По вопросам рекламы [email protected]