【问题标题】:lvalue required as unary '&' operand in c++11在 c++11 中需要左值作为一元“&”操作数
【发布时间】:2017-03-14 11:28:56
【问题描述】:

我正在编写 c++11。 在A类中,我有一个成员变量“成员”,它被定义为

vector<OtherClass> member; // A's member variable

我想将A(所以我想将向量中包含的OtherClass中的所有数据类型)序列化为二进制格式的文件,所以我定义了一个函数write如下。

void A::write(ostream& os){ // A's function for outputting A
   os.write(reinterpret_cast<const char*>( &(member.size()) ), sizeof(member.size()));
}

但是编译器说左值需要作为一元'&'操作数。

如何在 write 函数中不创建 long size=member.size() 等临时对象来修复它?

【问题讨论】:

  • 请明确您收到的确切错误消息。
  • 这看起来很不幸,但我无法在没有本地人的情况下实现。
  • 你到底想写什么给os
  • 由于需要左值,因此您无法制作临时文件。只好硬着头皮去做。如果你有一个非常酷的编译器,它甚至可以优化它,如果不复制 4/8 字节也没什么大不了的。 I/O 如此繁重,您永远不会注意到一个副本。

标签: c++ ostream


【解决方案1】:

问题是&amp;(member.size()) - 你没有分配 size() 的返回值并试图获取它的地址(它甚至可能没有地址)。

但不知道为什么你在这里调用 size 无论如何你需要实际数据的起始地址:member.data()(或者如果你没有 C++11 &amp;member[0]

【讨论】:

  • 当您write 一个向量时,您需要将其写入size,然后将其写入data,否则您将不知道read 回到了多少。
  • @virgesmith OP想要序列化向量。无论如何,他将需要同时写入数据和大小。要使用ostream.write 方法写入大小,需要知道正在写入的内容的地址和大小——size() 返回值的地址和大小。
  • ostream& write (const char* s, streamsize n);参见cplusplus.com/reference/ostream/ostream/write,即在本例中为os.write(reinterpret_cast&lt;const char*&gt;(member.data()), member.size() * sizeof(OtherClass))
  • @virgesmith 由​​于您的代表较低,您将看不到我已经根据 alexeykuzmin0 的类似评论删除了相同的答案;似乎在这种情况下,提问者实际上是首先尝试序列化向量的 size (并且可能接下来会序列化内容)。
  • 不要忘记可疑的sizeof(member.size()) ;)
【解决方案2】:

“如何在不创建临时对象的情况下修复它”

你不能。你想使用&amp;,它接受一个对象的地址。没有对象,没有地址。就是这么简单。

请注意,您的 long size = member.size() 想法不会创建 临时 变量。这是一个普通的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多