编译我的三文件程序(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绝对是比我更好的程序员。)

最佳答案

基本上,RapidXML xml_document类型是不可复制的。如您所发布的代码片段所示(以及注释“禁止复制”的含义),复制构造函数和赋值运算符是私有的,可以强制编译器出错。

您应该在函数中动态创建一个并返回一个指针-或者使该函数以对现有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;


后者显然需要智能指针,但这可以说明这一点。

关于c++ - 编译器不会让我返回rapidxml::xml_document,并在头文件中报告错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25561004/

10-12 02:04