【问题标题】:How to Pass Iterator as Function Parameter in C++ [duplicate]如何在 C++ 中将迭代器作为函数参数传递 [重复]
【发布时间】:2020-05-31 11:46:32
【问题描述】:

我正在编写自己的 C++ 矢量类,我希望能够将迭代器作为函数参数传递给我的 reverse() 函数,这样我就可以执行类似的操作

vector<int> scores{5,8,89,32};
reverse(scores.begin(), scores.end());

而不是

...
scores.reverse(); 
or 
reverse(scores)

我可以用这段代码做后面的事情

template<typename T>
void reverse(vector<T> &orig) {
    //Reverse the elements of the array
    auto begin = orig.begin();
    auto end = --orig.end();    //Move the iterator 1 place back to keep within range

    while (begin < end) {

    std::swap(*begin, *end);

    begin++;
    end--;
    }
}

但是当我这样做时

template<typename T>
void reverse(vector<T>::iterator begin, vector<T>::iterator end) {

    while (begin < end) {

        std::swap(*begin, *end);

        begin++;
        end--;
    }
}

我收到此错误

error: expected ')' before 'begin'

请问我做错了什么?

谢谢。

【问题讨论】:

  • 我偶然发现了更多问题: 1. 即使修复了@NutCracker,我也收到了投诉,因为类型推导没有按预期工作。作弊后跳过扣除... 2. 你的reverse() 有 U.B.您访问end,但end 可能是存储结束的一个结束。所以,我在循环中修复了迭代。这是我的固定样本:Live Demo on coliru。 (但是,@NutCracker 指出了您问题的主要问题。因此,我没有将我的发现添加为答案。)
  • 非常感谢。我应该在调用 reverse 函数时添加模板类型。我没有。刚刚做了,在我添加了@NutCracker 建议后它起作用了。现在可以了。

标签: c++ templates vector parameters iterator


【解决方案1】:

应该是:

template <typename T>
void reverse(typename std::vector<T>::iterator begin, typename std::vector<T>::iterator end)
{...}

如果没有typename,编译器无法确定iterator 是成员还是类型。所以编译器假定它是一个成员。

【讨论】:

  • 非常感谢。我刚刚这样做并得到了这个错误:..\main.cpp:37:39: error: no matching function for call to 'reverse(my::vector::iterator, my::vector: :iterator)' my::reverse(scores.begin(), scores.end()); ^ ..\bucket.h:230:6:注意:模板参数推导/替换失败:..\main.cpp:37:39:注意:无法推导模板参数'T' my::reverse(scores.开始(),分数。结束());
  • @delivite 我建议您从代码中删除 using namespace std;。并在来自标准命名空间的所有内容前面添加std::。如果这对您有帮助,请告诉我。
  • 我没有 using namespace std;在我的代码中。我把我的类放在 my:: 命名空间中。这解释了我的::vector
  • 我刚刚发现了最后一个错误的问题。非常感谢。现在可以了。我已经检查了这篇文章的绿色标记。再次感谢。
  • @delivite 很高兴我能帮上忙
猜你喜欢
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2011-04-28
  • 2022-01-16
  • 2021-11-28
  • 2017-03-31
相关资源
最近更新 更多