【发布时间】:2021-04-24 14:57:48
【问题描述】:
我有代码:
#include <iostream>
class Foo {
};
namespace Bar {
struct Foo {
};
}
namespace Baz
{
void baz(const Foo &)
{
std::cout << "Hello";
}
}
int main()
{
Baz::baz(Bar::Foo());
}
编译器无法确定要使用哪个 Foo 并产生错误:
main.cpp: In function 'int main()':
main.cpp:23:19: error: invalid initialization of reference of type 'const Foo&' from expression of type 'Bar::Foo'
23 | Baz::baz(Bar::Foo());
| ^~~~~
main.cpp:15:14: note: in passing argument 1 of 'void Baz::baz(const Foo&)'
15 | void baz(const Foo &)
|
当然,最简单的解决方案是使用::Foo 或::Baz::Foo,但我想用O(1) 行代码解决所有可能的歧义。
我的第一个想法是 using namespace Bar 在 Baz 命名空间内:
namespace Baz
{
using namespace Baz;
//...
using-declaration:使命名空间 ns_name 中的符号名称可访问以进行非限定查找,就好像在与该 using-declaration 出现的位置相同的类范围、块范围或命名空间中声明。
我希望所有Bar 名称都成为Baz 命名空间的一部分,并且非限定查找更喜欢Baz::Foo。但是由于某种原因它不起作用
但using Bar::Foo; 反过来又能解决问题。这让我更加困惑
namespace Baz
{
using Bar::Foo;
那么,我的问题是:在这种情况下,using namespace Bar 和 using Bar::Foo 有什么区别?
【问题讨论】:
标签: c++ name-lookup