我使用标准库的查找有什么问题C++?

What is wrong with my usage of C++ standard library's find?

本文关键字:什么 问题 C++ 查找 标准      更新时间:2023-10-16

我正在尝试使用C++标准库的find算法,如下所示:

  template<class T>
  const unsigned int AdjacencyList<T>::_index_for_node(
      const std::vector<T>& list, const T& node
  ) throw(NoSuchNodeException)
  {
    std::vector<T>::iterator iter = std::find(list.begin(), list.end(), node);
  }

当我尝试编译时,我会收到以下错误:

In file included from ../AdjacencyList.cpp:8:
../AdjacencyList.h: In member function ‘const unsigned int Graph::AdjacencyList<T>::_index_for_node(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
../AdjacencyList.h:99: error: expected ‘;’ before ‘iter’
../AdjacencyList.h:100: error: ‘iter’ was not declared in this scope
In file included from ../AdjacencyListTest.cpp:9:
../AdjacencyList.h: In member function ‘const unsigned int Graph::AdjacencyList<T>::_index_for_node(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
../AdjacencyList.h:99: error: expected ‘;’ before ‘iter’
../AdjacencyList.h:100: error: ‘iter’ was not declared in this scope
../AdjacencyList.h: In member function ‘const unsigned int Graph::AdjacencyList<T>::_index_for_node(const std::vector<T, std::allocator<_Tp1> >&, const T&) [with T = int]’:
../AdjacencyList.h:91:   instantiated from ‘const std::vector<T, std::allocator<_Tp1> > Graph::AdjacencyList<T>::neighbours(const T&) [with T = int]’
../AdjacencyListTest.cpp:18:   instantiated from here
../AdjacencyList.h:99: error: dependent-name ‘std::vector::iterator’ is parsed as a non-type, but instantiation yields a type
../AdjacencyList.h:99: note: say ‘typename std::vector::iterator’ if a type is meant

我觉得"依赖名称"std::vector::迭代器"被解析为非类型,但实例化产生了一个类型"这一点是理解我做错了什么的关键,但我的豌豆脑无法提取其含义。

更新:根据接受的答案,我需要添加一个typename,还需要使用const_iterator,所以有问题的代码行变成了:

    typename std::vector<T>::const_iterator iter = std::find(list.begin(), list.end(), node);
std::vector<T>::iterator iter = /* .... */; 

iterator是一个依赖名称(实际上,它依赖于类型参数T(。除非使用typename:,否则假定从属名称不会命名类型

typename std::vector<T>::iterator iter = /* .... */;

有关更多信息,请考虑阅读Stack Overflow C++FAQ条目"我必须在依赖名称上放置"template"answers"typename"的位置和原因?">

您还需要使用const_iterator,因为list是常量限定的。您可能也应该删除异常规范;最好是"永远不要编写异常规范"。