C++ g编译器错误,映射为<;T、 int>;::迭代器

C++ g编译器错误,映射为<;T、 int>;::迭代器,c++,g++,C++,G++,使用Visual Studio 2012时,以下代码编译无误(T是模板参数): pairret; 但是,当我使用g++时,它会抛出错误消息 error: type/value mismatch at argument 1 in template parameter list for template<class _T1, class _T2> struct std::pair 错误:模板结构std::pair的模板参数列表中参数1的类型/值不匹配 由于某些原因,它无法将map:

使用Visual Studio 2012时,以下代码编译无误(T是模板参数):

pairret;
但是,当我使用g++时,它会抛出错误消息

error: type/value mismatch at argument 1 in template parameter list for template<class _T1, class _T2> struct std::pair
错误:模板结构std::pair的模板参数列表中参数1的类型/值不匹配

由于某些原因,它无法将
map::iterator
识别为类型。对于g++,我应该如何解决这个问题?

您需要告诉编译器,限定id
map::iterator
确实是一个类型(它可以是静态成员)

pairret;
^^^^^^^^

似乎有一次VS总是比g++做得更好。

默认设置是假设依赖名称不是类型,除非您明确地这样说

使用此选项可以执行以下操作:

typename map<T, int>::iterator
typename映射::迭代器

另一种猜测是VS没有正确检查模板,但是(错误地)等待直到类型被实例化。@Boperson Ya VS做得不对。因为它肯定需要typename。
pair<typename map<T, int>::iterator, bool> ret;
     ^^^^^^^^
typename map<T, int>::iterator