1

这个问题几乎说明了一切。我需要初始化对空 STL 容器的引用(更准确地说,是std::set)。

试图:

typedef std::set<bozo *> bozo_set;
class BozoClass { public: BozoClass(): bozosetref(bozo_set()) {} }

将获得类似于以下内容的编译器错误:

bozo.cc:104: error: invalid initialization of non-const reference of type ‘bozo_set&’ from a temporary of type ‘bozo_set’

(只是一个旁注:这不是问我是否应该使用typedef它。我对此发表评论,但这并不是真正的问题。)

编辑:由于对此有很多评论,因此引用 this 的目的是允许外部类更改bozo该集合的元素,而不是使用大量不需要的方法BozoClass来管理该集合。

4

3 回答 3

1
#include <set>

struct Class {
    Class() : set(), setref(set) {}

    std::set<void *> set;
    std::set<void *> &setref;
};
于 2013-07-05T14:53:15.070 回答
1

编译器错误实际上很好地描述了您遇到的问题:

从“bozo_set”类型的临时变量中对“bozo_set&”类型的非常量引用进行无效初始化</p>

编译器告诉您您正在尝试获取临时引用。你不能*这样做,因为你引用的东西是临时的。换句话说,它将立即不复存在。临时被指的是bozo_set你在这里建造的:

bozosetref(bozo_set())
           ^^^^^^^^^^

一旦表达式bozosetref(bozo_set())完成执行,set实例化的 inbozo_set()将被销毁。

据推测,bozosetref是一个类型的成员变量set<bozo*>&

在我看来,它似乎BozoClass是为了拥有set你想要参考的东西。这很好,但是您通常这样做的方式是不引用set,而是直接实例化一个:

class BozoClass 
{ 
public: 
  BozoClass() {}
private:
  set<bozo*> mBozos;
};

现在,mBozos不是对 的引用set,而是对set自身的引用。

然后,您可以通过访问器向客户端提供对它的引用BozoClass

class BozoClass
{
public:
  // ...
  set<bozo*>& GetBozos() { return mBozos; }
};

客户可以反过来set直接通过此访问器使用和修改:

int main()
{
  BozoClass bc;
  bc.GetBozos().insert (new bozo); // or something
}

  • 实际上,您可以但不应该这样做。由于该集合本身尚未分配给变量,因此没有任何东西“持有”它。您对它的引用变得无效。
于 2013-07-05T15:18:39.767 回答
0

您不能传递对非 const 对象的引用。
在您的情况下,如果允许这样的事情,您将获得对类中已删除的临时 bozo_set 实例的引用,而不是对空集的引用。

于 2013-07-05T14:52:49.917 回答