对重载函数的不明确调用 - int 和 int>
ambiguous call to overloaded function - int and int&
void g(int& a)
{
std::cout<<"int&n";
}
void g(int a)
{
std::cout<<"intn";
}
int main()
{
int a = 2;
g(a); //won't compile (at least under MSVC 2012)
std::cin.ignore();
}
这里有没有一种方法可以避免不明确的调用错误?类似g( static_cast<int&>(a) );
如果可以强制转换,当然有一种方法可以消除调用的歧义:
g(const_cast<int const&>(a));
如果你坚持要调用参考版本,那么分辨率就有点棘手了:
static_cast<void(*)(int&)>(g)(a);
这个答案与我回答时的问题有关。
OP不断增加这个问题,我不想再追问了…
是的,是的,你是对的,它涉及到铸造来解决歧义:
#include <iostream>
void g(int& a)
{
std::cout<<"int&n";
}
void g(int a)
{
std::cout<<"intn";
}
int main()
{
int a = 2;
static_cast< void(*)(int&) >( g )( a );
}
注意:若要在Visual Studio中运行此操作并查看结果窗口,请使用[Ctrl F5],或者在main
的最后一个右大括号上放置断点并在调试器中运行。但更好的是,只需从命令行运行即可。无需添加“停止";最后!:-)
修订:Dietmar在他的回答中展示了如何使用
const
的强制转换来调用按值参数重载。我甚至没有想过,但如果你想这样做(仅限于不考虑参考版本),请使用const_cast
而不是static_cast
。或者更好的方法是,只需从参数中生成一个右值表达式,例如,在前面添加一个方便的小+
符号
g( +a );
:-)
为了解决重载问题,绑定到正确类型的引用是完全匹配的,就像绑定到正确的非引用一样,因此两个重载相对于左值int
参数具有相同的优先级。
可以使第二个过载采用int const &
,在这种情况下,它可以以完全相同的方式使用,但将是一个不同的过载。
或者,您可以通过投射函数类型来完全避免过载解析:
static_cast<void(&)(int)>(g)(a);
static_cast<void(&)(int&)>(g)(a);
不过,对于存在歧义的函数的每次调用(即传递左值int
时),都必须这样做。
您必须观看此视频。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'