V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
xzpjerry731
V2EX  ›  MongoDB

mongocxx document steam 使用 time_t 转的 long long,在 mac 下可以编译运行,在 docker 的 ubuntu 里报错

  •  
  •   xzpjerry731 · 2018-03-11 13:55:50 +08:00 · 4261 次点击
    这是一个创建于 2482 天前的主题,其中的信息可能已经有所发展或是发生改变。

    报错都发生在 bsoncxx ::builder::stream::document{} << {某个从 time_t 通过(long long)转型的变量}

    提示 error: call of overloaded 'append(long long int)' is ambiguous

    请问是什么问题?

    第 1 条附言  ·  2018-03-12 00:24:47 +08:00

    @gnaggnoyil #1 不好意思,之前发帖的时候太匆忙了没有表述到位。大致可以总结成下面这种情况,只要用了time_t转成的long long就不行(在ubuntu环境下)

    time_t now = time(0);
    auto config = bsoncxx::builder::stream::document{} 
                             << "last_studied@" << (long long)(now)  // 第47行
                             << bsoncxx::builder::stream::finalize;
    

    但是下面这种情况就没有编译报错

    auto config = bsoncxx::builder::stream::document{} 
                             << "last_studied@" << (long long)(946684800) 
                             << bsoncxx::builder::stream::finalize;
    

    具体的编译错误如下(可以确定都是同样内容的编译错误,除了对应的行数不同):

    g++ -c -std=c++11 -g jobPool.cpp -I/usr/local/include/mongocxx/v_noabi -I/usr/local/include/libmongoc-1.0 -I/usr/local/include/bsoncxx/v_noabi -I/usr/local/include/libbson-1.0
    
    
    In file included from /usr/local/include/bsoncxx/v_noabi/bsoncxx/builder/stream/key_context.hpp:20:0,
                     from /usr/local/include/bsoncxx/v_noabi/bsoncxx/builder/stream/document.hpp:18,
                     from jobPool.h:15,
                     from jobPool.cpp:4:
    
    
    /usr/local/include/bsoncxx/v_noabi/bsoncxx/builder/stream/value_context.hpp: In instantiation of 'typename std::enable_if<(! std::is_convertible<T, std::function<void(bsoncxx::v_noabi::builder::stream::single_context)> >::value), base>::type bsoncxx::v_noabi::builder::stream::value_context<base>::operator<<(T&&) [with T = long long int; base = bsoncxx::v_noabi::builder::stream::key_context<>; typename std::enable_if<(! std::is_convertible<T, std::function<void(bsoncxx::v_noabi::builder::stream::single_context)> >::value), base>::type = bsoncxx::v_noabi::builder::stream::key_context<>]':
    
    
    jobPool.cpp:47:58:   required from here
    
    
    /usr/local/include/bsoncxx/v_noabi/bsoncxx/builder/stream/value_context.hpp:70:9: error: call of overloaded 'append(long long int)' is ambiguous
             _core->append(std::forward<T>(t));
    
    3 条回复    2018-03-12 05:06:35 +08:00
    gnaggnoyil
        1
    gnaggnoyil  
       2018-03-11 17:28:42 +08:00   ❤️ 1
    没看懂.`bsoncxx::builder::stream::document`的`operator<<`不是只能接受 string,bson 的 document 和`bsoncxx::builder::stream::finalize`的吗.哪儿有接受 long long 的?LZ 能不能发一下详细的编译错误?
    xzpjerry731
        2
    xzpjerry731  
    OP
       2018-03-12 00:27:36 +08:00
    @gnaggnoyil #1 append 更多信息了,谢谢你的回复!
    xzpjerry731
        3
    xzpjerry731  
    OP
       2018-03-12 05:06:35 +08:00
    @gnaggnoyil #1 问题解决了,受到你的启发,我把(long long)换成了 bsoncxx::types::b_int64{}, 然后就可以了。估计 mac 下的编译器有考虑到把原生类型转换成 bsoncxx 的类型,但是 ubuntu 下的没有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:35 · PVG 04:35 · LAX 12:35 · JFK 15:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.