Почему разрешение области не работает в присутствии decltype?
Я понимаю, что decltype используется для запроса типа объектов/переменных и т.д.
Из примеров, представленных в википедии, например:
int i;
decltype(i) x3; // type is int
Я предположил, что могу сделать что-то вроде этого:
class A
{
public:
int a, b;
};
template<typename T>
struct IsClass
{
enum { Yes = std::is_class<T>::value };
enum { No = !Yes };
};
std::vector<A> v;
auto it = v.begin();
IsClass<decltype(it)::value_type>::Yes
Потому что после этой строки законно:
IsClass<std::vector<A>::iterator::value_type>::Yes
Увы, он не будет компилироваться, ссылаясь на следующее: error C2039: 'value_type' : is not a member of '
global namespace''`
Любые идеи относительно того, почему было разрешено разрешение области, чтобы вести себя таким образом в присутствии decltype?
P.S: Если это имеет значение, я использую MSVC2012 (без Nov CTP)
Ответы
Ответ 1
Это известная ошибка в компиляторе Visual С++. Он еще не исправлен, как в Visual С++ 2013 Preview. Вы можете обойти эту проблему, используя std::common_type
:
IsClass<std::common_type<decltype(it)>::type::value_type>::Yes
^^^^^^^^^^^^^^^^^ ^^^^^^^
(std::common_type
с единственным аргументом шаблона дает этот тип аргумента, это стандартизованный эквивалент С++ 11 шаблона identity
, который долго использовался в метапрограммировании.)
Вы можете найти отчет об ошибках в сообществе Microsoft Connect: Невозможно использовать decltype перед оператором области видимости. Если эта проблема важна для вас, подумайте над тем, чтобы опубликовать этот отчет об ошибке.