c++ - 具有相同参数的命名空间中的函数和函数之间的歧义
问题描述
谁能解释为什么 和 之间有A::f(const B& b)
歧义f(const A::B& b)
。我认为代码对意图非常明确。
#include <iostream>
namespace A
{
class B
{
protected:
double value_;
public:
B() : value_(15.0) {}
double getValue() const {return value_;}
};
void f(const B& b)
{
std::cout << "f(b) = " << b.getValue() << std::endl;
}
}
void f(const A::B& b)
{
std::cout << "Other f(b) = " << b.getValue() << std::endl;
}
int main()
{
A::B b;
A::f(b);
f(b);
return 0;
}
error: call of overloaded ‘f(A::B&)’ is ambiguous
但是,无论编译器标志和优化如何,g++ 7.5.0 和 clang 6.0.0 都抱怨函数调用不明确 ( )。
解决方案
这是一个依赖于参数的查找的例子。
即使::main
在全局命名空间中,也可以在不使用完全限定名称的情况下调用,因为它是在其参数A::f
的命名空间中查找的, . 因此,和之间存在歧义。A
A::B
::f
A::f
要解决歧义,您需要调用A::f(b)
(如您所做的那样)或::f(b)
.
推荐阅读
- makefile - 如何在评论附近传递命令行参数
- javascript - 如何使用 forkJoin 将成功和不成功的请求保存在单独的数组中?
- javascript - 根据象限翻转工具提示
- c# - 返回任务的模拟方法
- mysql - SELECT 记录包含一些单词而不是整个单词
- c# - Web-API 控制器多个 GET int 和字符串参数
- azure-data-explorer - Azure 数据资源管理器 (ADX) 筛选的引入
- svelte - 当 Svelte 中的 prop 更改时更新深层组件
- bash - 如何通过 Chef 运行 sh 脚本并显示 echo 输出
- amazon-web-services - 使用 Sig v4 将数据从 AWS Lambda 索引到 Elasticsearch 时出现 403 错误:“[indices:data/write/bulk] 没有权限”