【问题标题】:Passing temporary object to function将临时对象传递给函数
【发布时间】:2013-07-10 00:34:58
【问题描述】:

我认为这被称为临时对象。这是我的场景:

我有一些功能:

void List<T>::Remove(ListIterator &)
ListIterator List<T>::Begin() //returns an iterator pointing to the first node in the list.

当我尝试做这样的事情时,在 G++ 中:

mylist.Remove(mylist.Begin())

我收到以下错误:

没有匹配的函数调用 Remove(ListIterator)。

我没有按值获取 ListIterator 的函数,我也不想要一个。但是,我不确定我正在尝试做的事情是否有意义。该代码适用于 Windows VS2012,但不适用于 g++。

非常感谢任何有关如何修复我的实现或解释此行为的建议!

【问题讨论】:

  • 你能用 const & 代替吗?
  • @doctorlove 甚至传值。迭代器(至少符合 STL 的迭代器)通常应该设计成副本非常便宜。
  • 确实,我只是想知道它说 List 而不是 list 所以想知道是否发生了“不符合 STL”的事情
  • 它们都不符合 stl,它本质上只是一个练习,这些都是自制的类。 ListIterator 是 List 的朋友,因此 List 可以修改 ListIterator。我希望能够修改列表,然后能够继续使用迭代器,这就是为什么我想通过引用传递它

标签: c++ object parameter-passing


【解决方案1】:

Kris,如果你看到编译器给出的错误(在你的第一条消息中)“没有匹配的函数来调用 Remove(ListIterator)”,编译器会声明 ListIterator 作为参数传递给 Remove,而它需要 ListIterator&,所以要解决更改 func 声明开始返回 ListIterator& ,或者按照 Kris 的建议,更改 Remove func 声明以将 const ListIterator & 作为参数。我希望这两个选项都可以工作。

【讨论】:

    【解决方案2】:

    mylist.Begin() 的结果是临时的(除非 mylist.Begin() 返回一个引用)。你不能使用 用于初始化非常量引用的临时对象。要么分配 结果到一个变量,并将其传递给Remove,使 引用 const,或者使用传值。

    至于为什么VS2012编译它:VS2012不符合。

    【讨论】: