重载模板类方法

时间:2016-07-22 16:29:51

标签: c++ templates c++11 inheritance

我尝试重载我的一个XML类的受保护函数。

简而言之,C_XmlArrayField<T>有助于保存std::list<T>个对象,具有原始类型(或带有operator>> std::*stringstream的类型)。并且我有C_XmlClassArrayField<T>做同样的事情,但是继承了C_XmlBasicObject类的类(这是一个带有两个方法的抽象类,一个用于将实例保存到XML元素中,另一个用于从XML元素加载实例。)

因此,C_XmlArrayField<T>具有写入和阅读功能,以及writeItemreadItem虚拟函数,它们使用std::*stringstream来编写/读取单个项目。 C_XmlClassArrayField<T>以这种方式声明:

template<T>
class C_XmlClassArrayField : public C_XmlArrayField<T*>
{ ... blabla ... }

我给你两个文件:

所以,这是我的问题:

我为writeItem重载了readItemC_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 >>,但这不是我搜索的内容。我想知道如何通过重载writeItemreadItem方法来解决这个错误。通常情况下,C_XmlClassArrayField<T>不要使用任何std::*stream

0 个答案:

没有答案