为何int对象与函数类型会导致名称k出现歧义?
namespace A { int k; } void k(int,int){/*dosomething*/} int main() { using namespace A; k(1,1);//ooop!k is ambiguous! }
问题解析
你的疑惑完全合理,但这里的核心是C++的名称查找和语法合法性检查是分两步走的,歧义发生在第一步,根本轮不到第二步判断类型是否匹配。
第一步:名称查找
当你写下k(1,1)时,编译器首先会在当前作用域(以及通过using namespace A引入的作用域)里找所有叫k的实体。这里它会同时找到:- 命名空间
A里的int变量k - 全局作用域里的函数
k(int,int)
这时候,名称查找的结果是一个包含多个同名实体的集合,C++标准规定这种情况直接触发歧义错误,因为编译器不知道你指的是哪一个k。
- 命名空间
第二步:重载决议/语法检查(永远到不了这一步)
只有当名称查找只找到一个实体,或者找到的都是函数(可以进入重载决议)时,编译器才会去检查“这个实体能不能用当前的语法调用/赋值”。但在你的例子里,第一步就卡住了——变量k和函数k重名,不管后续调用语法对变量来说是否合法,编译器都不会继续往下走。
举个反例验证:如果把代码改成k = 5;,你同样会得到歧义错误,哪怕函数k根本不能被赋值。这就说明,歧义的判定和实体的类型、后续使用是否合法完全无关,只看名称查找阶段是否找到了多个同名实体。
要解决这个问题,你可以明确指定你要的实体:比如用::k(1,1)调用全局函数,或者A::k引用变量。
内容的提问来源于stack exchange,提问作者choxsword
相关产品推荐
相关产品推荐

