编译器不允许我返回一个rapidxml :: xml_document,并报告头文件中的错误

时间:2014-08-29 02:53:14

标签: c++ rapidxml

编译我的三文件程序(main.cpp,source.cpp,header.hpp)会产生以下错误:

source.cpp: In member function ‘rapidxml::xml_document<> MyClass::generate_xml_document()’:
source.cpp:559:9: error: use of deleted function ‘rapidxml::xml_document<>::xml_document(const rapidxml::xml_document<>&)’
In file included from header.hpp:12:0,
                 from source.cpp:11:
rapidxml.hpp:1358:11: error: ‘rapidxml::xml_document<>::xml_document(const rapidxml::xml_document<>&)’ is implicitly deleted because the default definition would be ill-formed:
rapidxml.hpp:1322:9: error: ‘rapidxml::xml_node<Ch>::xml_node(const rapidxml::xml_node<Ch>&) [with Ch = char, rapidxml::xml_node<Ch> = rapidxml::xml_node<char>]’ is private

命名行是:

  • source.cpp:559仅表示return doc;。它是生成rapidxml::xml_document<>
  • 的函数的结尾
  • header.hpp:12和source.cpp:11状态#include "rapidxml.hpp"
  • rapidxml.hpp周围的区域:1322声明:

    private:
        // Restrictions
    
        // No copying
        xml_node(const xml_node &);
        void operator =(const xml_node &);
    
  • rapidxml.hpp:1358是课程xml_document的开头:class xml_document: public xml_node<Ch>, public memory_pool<Ch>

这在rapidxml中是错误的吗? (我很确定不是,因为Marcin Kalicinski绝对比我更好的程序员。)

1 个答案:

答案 0 :(得分:2)

基本上,RapidXML xml_document类型是不可复制的。正如您发布的片段所示(以及注释&#34;无复制&#34;暗示),复制构造函数和赋值运算符是私有的,以强制编译器错误。

您应该在函数中动态创建一个,并返回一个指针 - 或者,让该函数将现有xml_document的引用作为输入。

所以不是这个

xml_document myFunc() 
{ 
  xml_document doc;
  ...
  return doc; 
}

xml_document d = myfunc();

..你需要这个

void myFunc(xml_document &doc) 
{
  ... 
}

xml_document d;
myfunc(d);

或者,使用动态分配:

xml_document *myFunc() 
{ 
  xml_document *doc = new xml_document();
  return doc; 
}

xml_document d = myfunc();
...
delete d;

后者显然需要智能指针,但这表明了这个想法。