Возможность использовать выражение decltype для формирования квалифицированного идентификатора ( type :: type ) была добавлена только недавно (ну, год назад) в рабочий документ C ++ 0x, но это будет частью готового стандарта. Таким образом, код, который вы написали, на самом деле является правильно сформированным C ++ 0x. В конце концов gcc догонит.
Тем временем вы можете использовать что-то вроде
#include <map>
template<typename T>
struct decltype_t
{
typedef T type;
};
#define DECLTYPE(expr) decltype_t<decltype(expr)>::type
int main()
{
std::map<int, int> m;
decltype(m) n;
DECLTYPE(m)::iterator it; // works as expected
}
Хотя, если вы похожи на меня, глупо будет прибегать к таким уловкам:)