以下情况:
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()
版本呢?我找不到语法上的方法来访问它。真的没有办法吗?
我知道这个问题与实践不太相关。不过,我觉得很有趣。
1条答案
按热度按时间vvppvyoh1#
内联名称空间中的符号完全是其封闭名称空间的一部分,也是其内联名称空间的一部分。