C++11中迭代器的类型别名/using声明

3

我遇到了一些问题,无法使用我认为应该可行的using声明:

#include <iostream>
#include <vector>
using namespace std;

template<typename C, typename V>
vector<typename C::iterator> find_all1(C& c, V v)
{
  vector<typename C::iterator> res;
  for (auto p = c.begin(); p!=c.end(); ++p) {
    if (*p == v)
      res.push_back(p);
  }
  return res;
}

template<typename T>
using Iterator<T> = typename T::iterator;

template <typename C, typename V>
vector<Iterator<C>> find_all2(C& c, V v)
{
  vector<Iterator<C>> res;
  for (auto p = c.begin(); p != c.end(); ++p) {
    if (*p == v)
      res.push_back(p);
  }
  return res;
}

int main(int argc, const char *argv[])
{
  return 0;
}

这基本上是 Stroustrup 的书中的一个例子,但它无法编译。第一个部分 (find_all1) 可以,但尝试使用 using 声明的模板版本不行。
错误信息的前导部分如下:
$ make
c++  -g -fPIC -std=c++0x -stdlib=libc++  -c -o iter_tests2.o iter_tests2.cpp
iter_tests2.cpp:18:7: error: no template named 'Iterator'; did you mean 'iterator'?
using Iterator<T> = typename T::iterator;
      ^~~~~~~~
      iterator
/usr/bin/../lib/c++/v1/iterator:415:25: note: 'iterator' declared here
struct _LIBCPP_TYPE_VIS iterator
                        ^
iter_tests2.cpp:18:15: error: partial specialization of alias templates is not permitted
using Iterator<T> = typename T::iterator;
              ^~~

还有更多内容,但我认为重要的部分是使用声明。

1个回答

6

你的语法不正确,请删除<T>

template<typename T>
using Iterator = typename T::iterator;

是的,就是这样,谢谢。我很好奇这个例子是斯特劳斯特鲁普的书中的一个打字错误还是标准发生了变化? - Gabriel Perdue
1
@GabrielPerdue 很可能是个打字错误。 - David G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接