【问题标题】:C++ - Cannot pass the object pointed by an iterator by referenceC++ - 无法通过引用传递迭代器指向的对象
【发布时间】:2014-07-28 15:36:22
【问题描述】:

我有以下一段代码,一个函数试图将对集合中的对象的引用 (foo) 传递给另一个函数 (goo)。

/**************** working ***************/
{
    std::set<MyStruct> foo;

    MyStruct abc = *foo.begin();
    goo(abc);
}    

int goo(MyStruct & st)
{
    //some code here
}


/**************** not working ***************/
{
    std::set<MyStruct> foo;

    goo( *(foo.begin()) );    
}    

int goo(MyStruct & st)
{
    //some code here
}

以及错误列表:

>file.cpp:190:45: error: no matching function for call to 'goo(const MyStruct&)'
>file.cpp:190:45: note: candidate is:
>file.h:33:9: note: int goo(MyStruct&)
>file.h:33:9: note: no known conversion for argument 1 from 'const MyStruct' to 'MyStruct&'

第一个版本编译正常,而第二个版本报错。我见过 const 关键字,但我没有在任何地方声明它为 const,而且集合也不是 const。你能解释一下我做错了什么吗?

【问题讨论】:

  • 请在问题中贴出相关代码。
  • 你为什么使用set
  • @DavidSchwartz 因为是的 :-p 无论如何,我不知道该集合是隐式常量,我的错。以下是显而易见的。谢谢大家。

标签: c++ iterator parameter-passing pass-by-reference


【解决方案1】:

set 包含具有唯一值的不可变对象,但 goo 需要非常量引用。要么更改 goo 以获取 const 引用,使用集合以外的东西,或者制作对象的副本。只要对象在集合中,就不能被修改,所以不能传递给修改(或可以修改)对象值的函数。

【讨论】:

    【解决方案2】:

    第一个版本有效,因为您将const MyStruct&amp; 分配给MyStruct 类型的变量,在这种情况下,复制构造函数 接受。当调用goo 时,变量abc 是可修改。

    您传递begin的解引用的第二个版本,关联容器的键是const(这是因为如果插入时可以更改键,那将是非常糟糕的容器,订单可能会混乱,Visual Studio 在某些版本之前就有这个问题)在这种情况下 begin 返回错误为 const MyStruct&amp;(不可修改)。

    如果goo不会改变参数的值,添加const,如果修改他的值,使用第一种情况。如果您需要使用修改值更新集合,请擦除并重新插入。

    【讨论】:

      【解决方案3】:

      在第一种情况下,您将 *foo.begin() 分配给一个变量(不是 const)。

      在第二种情况下,您立即将 *foo.begin()(在内部表示为 const 引用)发送到您的方法。

      【讨论】:

        猜你喜欢
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多