重载函数的调用是不明确的(两个函数在不同的范围内)
call of overloaded function is ambiguous (two function in different scope)
code:
namespace asd {
class A { };
void f(A &a) { }
}
void f(asd::A &a) { }
int main() {
asd::A instance;
f(instance);
return 0;
}
错误:
D:>g++ -Wall -std=c++98 -pedantic a.cpp
a.cpp: In function 'int main()':
a.cpp:10:12: error: call of overloaded 'f(asd::A&)' is ambiguous
a.cpp:10:12: note: candidates are:
a.cpp:6:6: note: void f(asd::A&)
a.cpp:3:7: note: void asd::f(asd::A&)
为什么编译器在命名空间 ASD 的作用域中搜索函数"f"?
为什么这被称为重载?这是两个不同的函数.
如果主要功能是这样的,我会理解错误:
int main() {
using asd::f;
asd::A instance;
f(instance);
return 0;
}
我会得到一个错误...但是有了这个,我不...
这种情况和我这样做的时候一样吗?
std::cout << str;
// meaning 1:
std::operator<<(std::cout, str);
// meaning 2:
::operator<<(std::cout, str);
当你这样做时
using asd::f;
你告诉编译器"当我在当前范围内使用符号f
时,我的意思实际上是asd::f
"。这就是它起作用的原因。
至于第一种情况,这是因为编译器在instance
类型(即asd
(以及全局范围内查找。它称为参数相关查找。
为什么编译器在命名空间 ASD 的作用域中搜索函数"F"?
依赖于参数的查找。参数类型 A
的范围为 asd
,因此命名空间也会搜索合适的重载。
为什么这叫重载?这是两个不同的函数。
这正是重载的意思:两个名称相同但作用域不同的函数,或者采用不同的参数。
这种情况和我这样做的时候一样吗?
是的,它可能意味着两者之一;但是由于没有::operator<<
,所以没有歧义。
C++执行参数相关查找。这意味着,如果您有一个函数的特定类类型的参数,那么为了查找该函数,编译器将在包含参数类型的命名空间中查找函数名称。
在下面的代码中,您已将实例指定为 class A
的变量,该变量是命名空间asd
int main() {
asd::A instance;
f(instance);
return 0;
}
因此,它也将在asd
命名空间中查找f
。要解决此问题,请使用: ::f(instance);
用于在全局命名空间中调用f
或asd
命名空间中调用asd::f(instance);
。
这称为 koenig 查找。如果您想了解更多信息,请转到此链接。
相关文章:
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 两个父类的构造函数的序列
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- 如何从两个不同的函数传递参数
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 如何比较两个函数的速度和性能
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 有一个构造函数,但有两个析构函数
- 为什么系统日志有两个不同的函数声明?
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- C++ 关于两个类构造函数的问题
- 如何创建两个具有相同名称和不同返回类型并基于布尔参数运行的函数
- 如何在构造器的成员初始值设定项列表中调用两个函数?
- 如何将这两个函数组合成一个实现?
- 将函数两个向量合并为第三个向量
- C++朋友函数两个数字的加法