如果内联命名空间具有相同的函数,我如何访问C++函数?

6pp0gazn  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(118)

以下情况:

namespace abc{
    inline namespace x{
        int f() { return 5; }
    }

    inline namespace y{
        int f() { return 6; }
    }

    int f() { return 7; }

    void g(){
        x::f();   // okay
        y::f();   // okay

        f();      // error: ambiguous!
        abc::f(); // error: ambiguous!
    }
}

GCC和clang一致,下面是GCC错误消息:

<source>: In function 'void abc::g()':
<source>:16:10: error: call of overloaded 'f()' is ambiguous
   16 |         f();      // error: ambiguous!
      |         ~^~
<source>:10:9: note: candidate: 'int abc::f()'
   10 |     int f() { return 7; }
      |         ^
<source>:3:13: note: candidate: 'int abc::x::f()'
    3 |         int f() { return 5; }
      |             ^
<source>:7:13: note: candidate: 'int abc::y::f()'
    7 |         int f() { return 6; }
      |             ^
<source>:17:15: error: call of overloaded 'f()' is ambiguous
   17 |         abc::f(); // error: ambiguous!
      |         ~~~~~~^~
<source>:10:9: note: candidate: 'int abc::f()'
   10 |     int f() { return 7; }
      |         ^
<source>:7:13: note: candidate: 'int abc::y::f()'
    7 |         int f() { return 6; }
      |             ^
<source>:3:13: note: candidate: 'int abc::x::f()'
    3 |         int f() { return 5; }
      |             ^
Compiler returned: 1

我可以显式指定inline namespace来访问重载,但是abc::f()版本呢?我找不到语法上的方法来访问它。真的没有办法吗?
我知道这个问题与实践不太相关。不过,我觉得很有趣。

vvppvyoh

vvppvyoh1#

内联名称空间中的符号完全是其封闭名称空间的一部分,也是其内联名称空间的一部分。

相关问题