【发布时间】:2023-03-29 07:18:01
【问题描述】:
命名空间限定问题:为什么下面没有推断出函数的命名空间?
namespace X {
void func(int) {}
struct Z{
void func(){
//func(int{}); does not compile
X::func(int{}); // this works
}
};
}
int main() {
X::Z z;
z.func();
}
【问题讨论】:
-
这与命名空间无关;不合格的名称查找找到
Z::func并停止查找。粗略地说,非限定名称查找在当前范围内查找名称,然后向外搜索其封闭范围;一旦找到该名称的声明,它就会停止。即使这样找到的实体后来被发现在原始上下文中不可用。另一种思考方式:Z::func将X::func隐藏在Z类的范围内,因此需要一个限定名来引用X::func -
如果你给
Z的成员函数起一个不同的名字,你会发现普通的func(0)可以工作。 -
@IgorTandetnik 这对我来说确实像是一个答案。
-
感谢@IgorTandetnik,这里的关键似乎是查找仅基于名称而不是整个签名
标签: c++ namespaces