V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
polebug
V2EX  ›  C

求解 Clang 编译下无法使用 getline 的问题

  •  
  •   polebug · 2017-01-03 09:41:04 +08:00 · 2193 次点击
    这是一个创建于 2889 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用语句 getline(cin,s); 报错 Error - no matching function for call to 'getline'

    相关环境 MacOS sublime2 clang 编译

    万脸懵逼... 找不到相关解决方法 QAQ 求解

    13 条回复    2017-01-03 13:16:44 +08:00
    forcecharlie
        1
    forcecharlie  
       2017-01-03 10:17:29 +08:00
    你是引入了
    #include <sdtio.h>
    ssize_t getline(char **lineptr, size_t *n, FILE *stream);

    还是
    #include <string>
    istream& getline (istream& is, string& str, char delim);

    http://www.cplusplus.com/reference/string/string/getline/
    Em5O7B1JGfjQnBry
        2
    Em5O7B1JGfjQnBry  
       2017-01-03 10:32:48 +08:00 via Android   ❤️ 2
    如果 C++的话。。。不要动不动就 using namespace std;
    直接写 std::getline 、 std::cin 来调用,
    如果用的多的比如 std:: cout,可以这样来: using std::cout;
    q397064399
        3
    q397064399  
       2017-01-03 10:37:54 +08:00
    楼上+1 C++历史遗留问题,包管理机制以及命名空间有问题,最好还是不要 using namespace std
    q397064399
        4
    q397064399  
       2017-01-03 10:39:00 +08:00
    使用系统函数或者库函数最好还是 使用全限定名称
    polebug
        5
    polebug  
    OP
       2017-01-03 11:08:01 +08:00 via Android
    @forcecharlie #include <string>
    polebug
        6
    polebug  
    OP
       2017-01-03 11:10:33 +08:00 via Android
    @q397064399
    @svenFeng
    不使用 using namespace std;果然解决了问题
    顺便想请问一下,以前在 win 下用 vs,dev-c++这类 ide 并没有遇到这类问题是为什么
    q397064399
        7
    q397064399  
       2017-01-03 12:54:34 +08:00
    @polebug 因为他们对新手友好,我只能这么解释,我用 vs 的时候 也没出国这档子事情,后来是上了 stackoverflow
    老司机教育我,要用全限定名 或者 using xx 之类的,我就学会了

    另外我 c/c++ 都是 linux 环境下搞的,不在 windows 下面搞,
    Em5O7B1JGfjQnBry
        8
    Em5O7B1JGfjQnBry  
       2017-01-03 13:08:48 +08:00   ❤️ 1
    #include <string>
    #include <iostream>

    using namespace std;

    int main(){
    string s;
    getline(cin, s);
    return 0;
    }


    如果你的代码是这样的,事实上我用 Linux 下的 clang++3.8/3.9 和 g++-6 编译,都不会报错,会调用这个函数: istream& getline (istream& is, string& str, char delim);
    ,微软家的编译器应该也是这样的,所以你可以把代码贴上来看看。
    Em5O7B1JGfjQnBry
        9
    Em5O7B1JGfjQnBry  
       2017-01-03 13:09:06 +08:00
    yangff
        10
    yangff  
       2017-01-03 13:10:38 +08:00
    不合理啊,怕别是编译器 /库实现的 bug
    Em5O7B1JGfjQnBry
        11
    Em5O7B1JGfjQnBry  
       2017-01-03 13:11:10 +08:00
    istream& getline (istream& is, string& str);看错- -,应该是调用这个。
    @polebug
    yangff
        12
    yangff  
       2017-01-03 13:15:00 +08:00   ❤️ 1
    #include <cstdio>

    namespace Fuck {
    void shit(int x){ printf("a"); }
    }

    void shit(double y) {printf("b");}

    using namespace Fuck;

    int main(){
    shit(1); // Fuck::shit(int);
    shit(1.0); // ::shit(double);
    }

    LZ 你执行这个试试?
    yangff
        13
    yangff  
       2017-01-03 13:16:44 +08:00
    至于限定不限定的……
    namespace A{
    class A
    //...

    }
    才坑……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2559 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:18 · PVG 13:18 · LAX 21:18 · JFK 00:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.