MongoDB C ++驱动程序 - 通过引用传递Query对象会在随后使用其排序时引发错误

时间:2012-09-12 06:44:25

标签: c++ mongodb mongodb-query mongodb-c

Windows 7 64 SP1 - MongoDB 2.2.0-rc2 - 提升1.42 - MS VS 2010旗舰版 - C ++驱动程序

我写过这个函数:

void printQuery(DBClientConnection &c, std::string &dc, const Query &qu = BSONObj(), std::string sortby = "" )

这个片段:

auto_ptr<DBClientCursor> cursor;
cursor = c.query(dc,qu.sort(sortby))

引发错误:

error C2663: 'mongo::Query::sort' : 2 overloads have no legal conversion for 'this' pointer.

sort (const string &field, int asc=1)应该是适用的重载。我认为这与使用const Query&及其成员函数sort有关。但如果我在没有Query&的情况下将其更改为const,那么我的参数初始化= BSONObj()会提升:

cannot convert from 'mongo::BSONObj' to 'mongo::Query &'

如果我通过值,那么编译就好了。

有没有办法避免任何一个错误(除了传递值)? 谢谢!

2 个答案:

答案 0 :(得分:1)

David Hows at MongoDB-user引导我完成解决方案:

而不是const Query &qu = BSONObj(),请使用Query &qu = Query()

  1. 我使用const收到错误,因为sort会更改查询对象的值 - 定义为常量。“所以我放弃了它。

  2. 使用BSONObj()作为默认值是有问题的,因为我不是“创建一个新对象,而是将一个新的BSONObj分配给一个Query对象的变量,所以没有创建任何新的,因此没有构造函数调用。”

  3. 所以我使用了Query()代替。如果qu为空,if ( qu.obj == BSONObj() )可用于测试。

    我的最终功能是:

    void printQuery(DBClientConnection &c, const string &dc, Query &qu = Query(), const string &sortby = "" )

    我无法将DBClientConnection限定为const。当使用c.query和

    时,它引发了no legal conversion for 'this' pointer

    C2662: 'mongo::DBClientWithCommands::count' : cannot convert 'this' pointer from 'const mongo::DBClientConnection' to 'mongo::DBClientWithCommands &' Conversion loses qualifiers

    使用c.count时。所以我保持不合格。

答案 1 :(得分:0)

你应该对光标进行排序而不是qu,我认为这是你的BSON查询。例如

auto_ptr<DBClientCursor> cursor;
cursor = c.query(dc,qu).sort(sortby)

查看http://www.mongodb.org/pages/viewpage.action?pageId=133415#C%2B%2BTutorial-Sorting了解详情。