【问题标题】:Passing vector iterator to a function c++将向量迭代器传递给函数 c++
【发布时间】:2014-10-07 07:20:03
【问题描述】:

谁能向我解释为什么下面的代码段可以编译但后面的注释行没有?

struct tObj
{
    int data;
    int moreData;
}

...

void funcToCall (tObj *obj, int moreData)
{
    //Useful stuff here
}

void mainFunction ()
{
    vector<tObj>::iterator it = vectorOfObjects.begin(); //assumes vectorOfObjects is already defined
    while (it != vectorOfObjects.end())
    {
        funcToCall (&(*it), 0); //This line works
        funcToCall (it, 0); //This line produces an error
        it++;
    }
}

产生的错误是这样的:

error: cannot convert ‘std::vector<tObj>::iterator {aka __gnu_cxx::__normal_iterator<tObj*, std::vector<tObj> >}’ to ‘tObj*’

关于为什么&amp;(*it) 有效但只是简单的it 无效的任何想法?逻辑上它们是一样的,不是吗?

因为* 不意味着取消引用,&amp; 意味着通过引用传递也就是相互抵消?

【问题讨论】:

  • 该函数需要一个指向tObj 的指针,你传递一个迭代器。迭代器不是指针(尽管某些实现可能vector&lt;T&gt;::iterator实现为T*。)

标签: c++ vector iterator


【解决方案1】:

it 是一个迭代器对象,按原样传递它意味着您正在尝试将一个 vector&lt;tObj&gt;::iterator 类型的对象传递给一个期望 tObj* 的函数,因此会出现错误。

当您执行*it 时,您将获得迭代器所代表的底层对象,当您在其上应用&amp; 时,您将获得 对象的地址,该地址为tObj* 类型这与函数的参数类型一致,因此没有错误。

【讨论】:

  • 啊,谢谢你的提示。我猜向量迭代器只是让我感到困惑。
  • 也许吧,但只要把迭代器想象成那样——不是指针,不是其他任何东西。它们只是允许您以某种方式迭代集合。这些迭代器提供了operator* 来访问底层元素,它与指针无关;它只是语法糖。
  • 这更有意义。非常感谢您提供的信息。我什至从未想过他们可能会超载operator*
【解决方案2】:

要编译代码,您必须声明一个重载函数,例如

void funcToCall ( std::vector<tObj>::iterator it, int moreData)
{
    //Useful stuff here
}

在一般情况下,类型 tObj *vector&lt;tObj&gt;::iterator 是不同的类型,尽管在 std::vector 的一些旧实现中,它的迭代器确实被定义为指针..

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2011-12-02
    • 2013-06-03
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多