为什么这个模板函数不能编译C++
Why won't this template function compile C++
我在互联网上看到了这段代码:
template <class T, class S>
T f(T& a, T& b, S c) {
T t1, t2, t3;
if (a==b) return t1;
if (c>0) return t2;
return t3;
}
其次是这些调用:
f('c', 5, 5); // why this doesn't compile?
f(3, 4, 6.0); // why does this compile?
第一个不编译,而第二个编译。为什么?
在C++(与 C 相反(中,'c'
是一个char
。
您的代码无法编译,因为参数T
的模板参数推导失败 - 这是不明确的。在f('c', 5, 5)
调用中,第一个函数参数说它应该是char
的,第二个说它应该是int
的。您期望编译器如何解决这种歧义?
如果需要T == int
可以显式指定第一个模板参数
f<int>('c', 5, 5);
或者您可以使用显式强制转换
f((int) 'c', 5, 5);
当然,正如已经指出的那样,即使您解决了模板参数推导问题,您仍然无法使用右值初始化非常量左值引用。由于后一个原因,您的两个调用也无效。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么使用 std::vector 的代码不能编译,但使用 std::unique_ptr 如果没有 noexcept
- 为什么我不能编译这个在Cygwin的Visual Studio中编写的C++文件?
- 为什么我不能编译这个简单的线程测试?
- 为什么 --string::end() 可以编译,而 --string.size() 不能编译?
- 为什么G 5.4不能编译此编译时质数代码
- 为什么最简单的模板模板不能编译
- 为什么这个 c++ 代码不能编译?
- 为什么我不能编译这个开源项目
- 为什么 g++ 不能编译一个简单的 GTK 程序?
- C++。为什么我不能编译此代码?使用const_cast去除恒常性有什么问题?
- 为什么这个模板函数不能编译C++
- 托管类型的成员函数不能编译为非托管函数
- 为什么这个简单的C++程序不能编译?
- 为什么这个C++代码不能编译
- 为什么没有enable_if就不能编译
- 使用重载的operator=不能编译
- CodeRunner——不能编译多个源c++程序
- 为什么[]可变{}不能编译
- 为什么自建的g++编译器不能编译我的代码