Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ yaml cpp、yaml::Node和模板操作符>&燃气轮机;_C++_Templates_Yaml Cpp - Fatal编程技术网

C++ yaml cpp、yaml::Node和模板操作符>&燃气轮机;

C++ yaml cpp、yaml::Node和模板操作符>&燃气轮机;,c++,templates,yaml-cpp,C++,Templates,Yaml Cpp,我正在用它进行某种序列化。要使其工作,每个类必须使用签名声明一个方法: template <typename T> void Serialize(T& s); 然后,我可以使用nodeimp.h(yaml cpp的一部分)中定义的以下运算符: 模板 内联无效运算符>>(常量节点和节点,T和值){ 如果(!ConvertScalar(节点,值)) 投掷无效刻度(node.m_标记); } 所以我的问题是:我应该如何解决这个问题?我绝对想要的是,对于序列化和反序列化,只有一个

我正在用它进行某种序列化。要使其工作,每个类必须使用签名声明一个方法:

template <typename T> void Serialize(T& s);
然后,我可以使用nodeimp.h(yaml cpp的一部分)中定义的以下
运算符

模板
内联无效运算符>>(常量节点和节点,T和值){
如果(!ConvertScalar(节点,值))
投掷无效刻度(node.m_标记);
}

所以我的问题是:我应该如何解决这个问题?我绝对想要的是,对于序列化和反序列化,只有一个方法,并且能够使用>>和首先,关于
重新解释cast
:您实际上想要
静态cast
。在您的例子中,您知道
val
T
(而不仅仅是
可序列化的
),因此您可以直接对其进行强制转换

在这里,我假设您将类声明为

class Foo: public Serializable<Foo> { ... };
class Foo:public Serializable{…};
reinterpret\u cast
会将
val
的字节解释为
T
,这不保证有效,但可能在您的情况下有效,因为您有单一继承,并且
Serializable
不会添加任何成员变量

接下来,谈谈您真正的问题:这是yaml cpp中的一个bug,现在已经修复了(如果您正在关注mercurial存储库,请参阅我打开的问题)


通过上述修复,我相信您的代码应该可以工作。如果您没有跟上存储库的进度,那么差异非常小-您可以在您的yaml cpp版本中对其进行修补。

奇怪的是,我尝试了
static\u cast
,但它不起作用,但现在起作用了。(也许我试着投T,而不是T*?)。无论如何,你的补丁工作得很好,谢谢你的修复。
template <typename T>
YAML::Emitter& operator<<(YAML::Emitter& out,
                          Serializable<T>& val)
{
    Serializer serializer(out);
    reinterpret_cast<T*>(&val)->Serialize(serializer);
    return out;
}
template <typename T>
void operator>>(const YAML::Node& node,
                Serializable<T>& val)
{
    Deserializer deserializer(node);
    reinterpret_cast<T*>(&val)->Serialize(deserializer);
}
template <typename T>
inline void operator >> (const Node& node, T& value) {
    if(!ConvertScalar(node, value))
        throw InvalidScalar(node.m_mark);
}
class Foo: public Serializable<Foo> { ... };