下一段代码编译非常成功:
#include <map>
template<typename KEY>
using umap = std::map<KEY, std::wstring>;
int main()
{
umap<int> m;
umap<double> m2;
}
同时,以与地图相同的方式添加迭代器模板会让编译器发誓并抱怨错误C2061:语法错误。所以下一个块不会编译:
template<typename KEY>
using umap = std::map<KEY, std::wstring>;
template<typename KEY>
using iter = std::map<KEY, std::wstring>::iterator;
int main()
{
umap<int> m;
umap<double> m2;
}
我们不能在迭代器中使用别名声明吗?为什么?并且会成为一种解决方法吗?
答案 0 :(得分:3)
您需要在typename
之前使用std::map<KEY, std::wstring>::iterator
关键字,因为它是一个从属范围。
因此,您的第二个代码应为:
template<typename KEY>
using umap = std::map<KEY, std::wstring>;
template<typename KEY>
using iter = typename std::map<KEY, std::wstring>::iterator;
int main()
{
umap<int> m;
umap<double> m2;
}