此代码无法编译:
class A;
void foo(A&) {
}
class A {
void foo() {
foo(*this); ///This does not compile
}
};
错误:
error: no matching function for call to 'A::foo(A&)'
foo(*this);
^
note: candidate is:
note: void A::foo()
这可以通过调用::foo(*this);
但是,让我们考虑一下我们在命名空间中的情况:
namespace bar {
class A;
void foo(A&) {
}
class A {
void foo() {
foo(*this); ///This does not compile
}
};
}
除了明确调用bar::foo(*this);
之外还有其他方法吗?我的意思是,有没有办法在下一个声明区域中查找名称,即包含bar
命名空间?
用例类似于here。
答案 0 :(得分:4)
我的意思是,有没有办法在下一个声明区域中查找名称, 即包含
bar
名称空间?
没有
你可以采取相反的方式:
void foo() {
using bar::foo;
foo(*this); /// OK now
}
答案 1 :(得分:1)
不在方法本身内。但是,您可以在.cpp文件中执行此操作:
namespace bar {
namespace {
auto outerFoo = foo;
}
void A::foo() {
outerFoo(*this);
}
}
请注意,名称outerFoo
是隐藏的实现细节,不会导致名称冲突(因为它位于匿名命名空间中)。