我尝试重载我的一个XML类的受保护函数。
简而言之,C_XmlArrayField<T>
有助于保存std::list<T>
个对象,具有原始类型(或带有operator>>
std::*stringstream
的类型)。并且我有C_XmlClassArrayField<T>
做同样的事情,但是继承了C_XmlBasicObject
类的类(这是一个带有两个方法的抽象类,一个用于将实例保存到XML元素中,另一个用于从XML元素加载实例。)
因此,C_XmlArrayField<T>
具有写入和阅读功能,以及writeItem
和readItem
虚拟函数,它们使用std::*stringstream
来编写/读取单个项目。 C_XmlClassArrayField<T>
以这种方式声明:
template<T>
class C_XmlClassArrayField : public C_XmlArrayField<T*>
{ ... blabla ... }
我给你两个文件:
C_XmlArrayField<T>
:http://pastebin.com/Mtfs3ShC C_XmlClassArrayField<T>
:http://pastebin.com/PFKFq0RK 所以,这是我的问题:
我为writeItem
重载了readItem
和C_XmlClassArrayField<T>
但是,当我尝试使用时,这会给我一个错误,即测试类(继承自C_XmlBasicObject
):
Libraries/ns_framework/Headers/ns/xml/C_XmlArrayField.hpp:203:7: error: no match for 'operator>>' (operand types are 'std::istringstream {aka std::__cxx11::basic_istringstream<char>}' and 'Test*')
我不明白,因为我在C_XmlClassArrayField<T>
内重载了虚拟功能。
最后,我的测试代码:
#include <iostream>
#include <ns/xml.hpp>
#include <ns/scene.hpp>
#include <ns/anim.hpp>
#include <ns/utils.hpp>
using namespace std;
using namespace ns;
using namespace tinyxml2;
// C_XmlObject inherits from C_XmlBasicObject.
class Test : public C_XmlObject
{
public:
Test(string name="test") :
C_XmlObject(name)
{
addField<int>("int").set(42);
}
};
int
main (int argc, char** argv)
{
C_XmlClassArrayField<Test> array("test");
array->push_back(new Test());
array->push_back(new Test());
XMLDocument doc;
auto root = doc.NewElement("root");
doc.InsertFirstChild(root);
array.write(doc, root);
doc.Print();
return 0;
}
我是否错过了模板的内容?
感谢您的回答!
编辑1 :@ r-sahu说我需要重载operator >>
,但这不是我搜索的内容。我想知道如何通过重载writeItem
和readItem
方法来解决这个错误。通常情况下,C_XmlClassArrayField<T>
不要使用任何std::*stream
。