在Visual Studio上使用容器的迭代器的别名模板

时间:2017-03-22 13:18:29

标签: c++ c++11 templates alias

下一段代码编译非常成功:

#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;
}

我们不能在迭代器中使用别名声明吗?为什么?并且会成为一种解决方法吗?

1 个答案:

答案 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;
}