【问题标题】:C++ context errorC++ 上下文错误
【发布时间】:2016-05-12 05:34:56
【问题描述】:

我有一个使用 rapidjson JSON 解析器的 C++ 类 Tester.cpp。

这是代码的缩写版本:

using namespace std;
using namespace rapidjson;

int main(int argc, char** argv)
{
   ...
 //Parse the JSON
          rapidjson::Document document;
          document.Parse(buffer);
              add_rules_to_tester(document);
   ...
    }

void add_rules_to_tester(rapidjson::Document document)
{...}

我的头文件 Tester.h 如下所示(再次缩写):

using namespace std;
using namespace rapidjson;

void add_rules_to_tester(rapidjson::Document document);

当我在 main 方法中注释掉 add_rules_to_tester 行时,我没有收到任何错误。当我取消注释该行时,我会收到以下编译时错误。

In file included from Tester.h:38:0,
             from Tester.cpp:28:
rapidjson/document.h: In function ‘int main(int, char**)’:
rapidjson/document.h:2076:5: error:‘rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>::GenericDocument(const rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>&) [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>; StackAllocator = rapidjson::CrtAllocator]’ is private
 GenericDocument(const GenericDocument&);
 ^
Tester.cpp:163:34: error: within this context
add_rules_to_tester(document);
                              ^
In file included from Tester.cpp:28:0:
Tester.h:76:6: error:   initializing argument 1 of ‘void add_rules_to_tester(rapidjson::Document)’
 void add_rules_to_tester(rapidjson::Document document);

对可能出现的问题有什么建议吗?在我看来,我以某种方式误解了名称空间的使用,但如果我能提供任何其他信息,请告诉我。谢谢!

【问题讨论】:

    标签: c++ namespaces rapidjson


    【解决方案1】:
    rapidjson/document.h: In function ‘int main(int, char**)’:
    rapidjson/document.h:2076:5: error:‘rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>::GenericDocument(const rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>&) [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>; StackAllocator = rapidjson::CrtAllocator]’ is private
     GenericDocument(const GenericDocument&);
    

    编译器告诉你 GenericDocument 的复制构造函数被声明为私有的,所以你不能在 GenericDocument 类之外使用它。

    您在此语句中调用复制构造函数,同时通过创建副本将其作为参数传递:

    add_rules_to_tester(document);
    

    解决方案:

    通过引用传递document 对象。

    void add_rules_to_tester(rapidjson::Document& document) //Note & here
    {...}
    

    并将其称为add_rules_to_tester(document);

    【讨论】:

    • 谢谢,我尝试通过引用传递,但出现以下错误:Tester.cpp:163:35: error: invalid initialization of non-const reference of type 'rapidjson::Document& {aka rapidjson: :GenericDocument<:utf8> >&}' 来自 'rapidjson::Document* 类型的右值 {aka rapidjson::GenericDocument<:utf8> >*}' add_rules_to_tester(&document);
    • 将 const 添加到声明中没有帮助。 void add_rules_to_tester(const rapidjson::Document &document)
    • void add_rules_to_tester(const rapidjson::Document& document) 没问题。请这样称呼它:add_rules_to_tester(document);
    【解决方案2】:

    要添加到上述答案, 确保函数在您的头文件或 main 上方的函数声明中也发生了更改! 我犯了不更改头文件的错误,花了 2 个小时弄清楚:( 如下更改函数声明!

    void add_rules_to_tester(rapidjson::Document& document) //add &!!
    

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多