如何从 C++ 中的引用中获取值

Posted

技术标签:

【中文标题】如何从 C++ 中的引用中获取值【英文标题】:How to get value from reference in c++ 【发布时间】:2013-08-22 17:08:02 【问题描述】:

我有一个函数,它返回一个 const& 给一个对象。比方说,

class Y 
    private:
        Id id;
    public:
        Id const& GetId() const;
  

现在这个 Y 对象是另一个类的一部分,比如说 X 类,它需要被 boost 序列化。

class X 
    template <class Archive>
    void serialize(Archive& ar, uint32 version)
     
         ar & y->GetId();
     
     Y y;

但是,boost 对此抱怨并给出错误:

error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>'

C:\Users\Y.h(580) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_iarchive<Archive>::operator &<const Id>(T &)' being compiled
            with
            [

如何序列化 Id?

【问题讨论】:

或许回顾一下Archive class 的使用情况会有所帮助。 Idserialize 功能吗? 您也可以发布整个编译器错误消息吗? 是的。确实如此。它是一大段代码的一部分。但是我们确实有逻辑来序列化 Id。编译器错误是:C:\Users\boost\windows\include\boost/archive/detail/check.hpp(162):错误 C2027:使用未定义类型 'boost::STATIC_ASSERTION_FAILURE' with [ x=false ] C:\Users\boost\windows\include\boost/archive/detail/iserializer.hpp(577) :参见函数模板实例化的参考 'void boost::archive::detail::check_const_loading(void)'使用 [ T=const Id ] 编译 错误信息应该包含静态断言失败原因的描述;它说什么?您的真实代码是否错误地尝试将-&gt; 应用于对象?我们能看到Id的序列化函数吗? 【参考方案1】:
 ar & y->GetId(); 

应该是

  ar & y.GetId();

【讨论】:

同意。我实际上在我的代码中使用了对对象 Y 的引用。所以它是-> 但是对于给定的 sn-p 它应该是 y。而不是 y->【参考方案2】:

boost 序列化的目的是使用引用序列化到存档。

问题是它接收值作为引用而不是 CONST 引用。

Id const& GetId() const; // Returns a const reference

试试下面的

Id & GetId(); 

然后是以下之一

ar & y.GetId();
ar << y.GetId();

如果您不喜欢封装的破坏,那么要么使用受保护的朋友,要么将其复制到另一个值并将该值作为引用传递

Id copy = y.GetId();
ar & copy;

【讨论】:

【参考方案3】:

除了问题->(见@thomas)你需要两个:

Id const& GetId() const;
Id& GetId();

或者你将 BOOST_SERIALIZATION_SPLIT_MEMBER 输入/输出分成两个。

【讨论】:

以上是关于如何从 C++ 中的引用中获取值的主要内容,如果未能解决你的问题,请参考以下文章

js怎么从session中取值

如何从变量中取值如果java中的Statement [关闭]

如何在 QT C++ 中从表的列中获取 SQL 中的所有值

JMeter 正则表达式提取器

java 如何将一个list中的值全部复制到另一个list中?

如何在 C++ 中通过引用返回向量