【问题标题】:function returning reference to a vector element返回对向量元素的引用的函数
【发布时间】:2013-12-20 20:24:14
【问题描述】:

我不知道如何返回对向量元素的引用。 [] 和 at() 正在返回引用,不是吗?

但是当我尝试以下操作时,它不会编译。

我正在使用 Visual C++,它给出了 cannot convert from 'const float' to 'float & 错误。

T& GetElement(size_t x) const {
    return _vector.at(x);
}

GetElement 是一个方法,_vector 是一个成员变量。

【问题讨论】:

  • 无法在 Visual C++ 中从 'const float' 转换为 'float &'
  • 使用const T&。您的方法是 const,因此 _vector 是 const,并且 at() 返回 const T&

标签: c++ reference stdvector


【解决方案1】:

这不会编译,因为您试图返回对向量元素的非常量引用,该元素本身就是 const

向量是const的原因是你的成员函数被声明为const

T& GetElement(size_t x) const // <<== Here

这个const-ness 标记会传播到所有成员,包括_vector

要解决此问题,请将 const 添加到返回的引用类型 (demo)。

【讨论】:

  • 谢谢。不幸的是,这并没有什么不同。还是一样的错误。
  • @jira 这可能与编译器有关:代码与 Gnu 的编译器完美编译(参见演示链接)。如果那是编译器,我不确定如何在没有破解的情况下解决这个问题。另一个建议可能是将返回类型从 T&amp; 更改为 T - 它不应该对 floats 和其他原语产生影响。
  • @jira 如果您在此更改后仍然收到错误,您可能正在尝试更改结果:t.GetElement(0) += 1。如果您希望能够修改元素,则还需要此函数的非常量重载。
  • 看起来我的代码中一定有很多与 const 相关的问题。每当我更改某些内容时,其他地方就会出现其他错误......无论如何,我将接受这个答案,因为它解决了我原来的问题
【解决方案2】:

你没有显示你的错误,但作为猜测,它看起来像 _vector 是一个成员(来自你给它的 _ 前缀)并且你在一个 const 成员函数中,所以at 将返回一个const 引用。所以你可能需要:

const T& GetElement(size_t x) const {
    return _vector.at(x);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多