- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我声明了两个模板,第一个将参数 x
从类型 T
转换为类型 U
,第二个从类型 U
键入 T
。如果我用 10 调用 cast
,编译器不会提示。我认为两者都符合使用要求,因此应该有歧义,这是真的吗?此代码打印 10。
#include <iostream>
template<typename T, typename U>
U cast(T x) {
return static_cast<U>(x);
}
template<typename T, typename U>
T cast(U x) {
return static_cast<T>(x);
}
int main() {
std::cout << cast<int,float>(10) << '\n';
}
最佳答案
当您使用 cast<int, float>
时, 两个模板都被考虑。
template<typename T=int,typename U=float>
U cast(T x);
template<typename T=int,typename U=float>
T cast(U x);
然后我们替换:
template<typename T=int,typename U=float>
float cast(int x);
template<typename T=int,typename U=float>
int cast(float x);
此时,没有要推断的类型。所以我们去重载决议。
在一种情况下,我们可以使用 int
并转换为 float
当 调用 Actor ,而在另一个我们采取 int
并转换为 int
当调用 Actor 。请注意,我根本没有研究 Actor 阵容的 body ;正文与重载决议无关。
第二个非转换(在调用点)是更好的匹配,因此选择了重载。
如果你这样做了:
std::cout << cast<int>(10) << "\n";
事情变得更有趣了:
template<typename T=int,typename U=?>
U cast(T x);
template<typename T=int,typename U=?>
T cast(U x);
对于第一个,我们无法推断 U
.第二个我们可以。
template<typename T=int,typename U=?>
U cast(int x);
template<typename T=int,typename U=int>
int cast(int x);
所以这里我们有一个可行的重载,它被使用了。
关于c++ - 为什么这个对模板的调用不模棱两可?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52609797/
我从一所大学获得了一些示例代码,导入了项目并尝试运行测试:方法 assertThat(Integer, Matcher) 对于 MyClass 类型是不明确的 每个 assertThat 都被标记为红
关于将 iOS 应用程序迁移到 Swift 3.0 的过程。这是我面临的一个问题。 先上相关代码: let calendar = NSCalendar.current, calendCompo = c
我刚开始研究 Java 8 Lambda 功能。我在 Java 7 中编写了这段代码,并尝试在 lamdas 中执行它。请注意,最后一行会产生编译错误,因为重载的函数不明确。我明白原因。如何使用 la
如何优先(告诉编译器)使用“函数接收引用”(#B)而不是“函数接收值”(#A)? #include using namespace std; class Heavy{/* ...... */}; /
我正在使用 Google Map API V3 显示车辆行驶路径及其路线方向。但是通过谷歌方向图标,很难找到方向。下图解释更多 我看到了每个图标,它是 source 我找到了图片路径,是 http:/
我是一名优秀的程序员,十分优秀!