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

cpp 问题请教

  •  
  •   codechaser · 2019-11-09 19:32:51 +08:00 · 3458 次点击
    这是一个创建于 1839 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #include <iostream>
    using namespace std;
    namespace foo
    {
    struct Foo
    {
    };
    void f(Foo)
    {
        cout << "f";
    }
    } // namespace foo
    int main()
    {
        foo::Foo foo;
        f(foo);
        return 0;
    }
    

    这里为什么不会报错呢? foo 命名空间没带直接使用了 f(),跟 foo 这个变量有何关系呢?

    6 条回复    2019-11-10 09:43:22 +08:00
    koebehshian
        1
    koebehshian  
       2019-11-09 19:45:36 +08:00   ❤️ 1
    当然是靠参数的命名空间猜到: https://en.cppreference.com/w/cpp/language/adl
    RicardoY
        2
    RicardoY  
       2019-11-09 20:17:06 +08:00 via Android   ❤️ 1
    函数的参数是类类型的话就还要查找参数类型所在的命名命名空间吧..依稀记得 primer 上特意提过
    codechaser
        3
    codechaser  
    OP
       2019-11-09 23:01:34 +08:00
    @RicardoY 受教!
    jorneyr
        4
    jorneyr  
       2019-11-10 07:42:15 +08:00
    void f(Foo) 不报错,因为函数 f 和结构体 Foo 在同一个命名空间里,仔细看括号。

    只有使用类型的时候才需要命名空间 (即访问 Foo),foo 已经是变量了。
    codechaser
        5
    codechaser  
    OP
       2019-11-10 09:21:51 +08:00
    @jorneyr 我想问的是 f(foo)的调用为啥不会报错。f 是在 foo 里的啊
    jorneyr
        6
    jorneyr  
       2019-11-10 09:43:22 +08:00
    @codechaser 发现看错地方了 =_=!!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:31 · PVG 00:31 · LAX 08:31 · JFK 11:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.