作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我写了这段代码,如果我取消注释倒数第二行,我会得到错误 - “模板参数推导/替换失败:”。是因为 C++ 中泛型函数的某些限制吗?此外,我的程序不会打印数组 b
的 float 答案。有什么我可以做的吗? (很抱歉在单个帖子中问了 2 个问题。)
P.S: 我刚开始学C++。
#include <iostream>
using namespace std;
template <class T>
T sumArray( T arr[], int size, T s =0)
{
int i;
for(i=0;i<size;i++)
{ s += arr[i];
}
return s;
}
int main()
{
int a[] = {1,2,3};
double b[] = {1.0,2.0,3.0};
cout << sumArray(a,3) << endl;
cout << sumArray(b,3) << endl;
cout << sumArray(a,3,10) << endl;
//cout << sumArray(b,3,40) << endl; //uncommenting this line gives error
return 0;
}
编辑 1:将 40 更改为 40.0 后,代码有效。这是我得到的输出:
6
6
16
46
在第二种情况下,我仍然没有得到 float 答案。有什么建议吗?
最佳答案
原因是编译器无法推导出T
的类型。
对于您的最后一个示例,它应该如何理解 T
是什么?第一个参数(b
)的类型是double[]
,而在函数定义中是T[]
。因此看起来 T
应该是 double
。但是,第三个参数 (40
) 的类型是 int
,所以看起来 T
应该是 int
.因此错误。
将 40
更改为 40.0
使其工作。另一种方法是在模板声明中使用两种不同类型:
#include <iostream>
using namespace std;
template <class T, class S = T>
T sumArray( T arr[], int size, S s =0)
{
int i;
T res = s;
for(i=0;i<size;i++)
{ res += arr[i];
}
return res;
}
int main()
{
int a[] = {1,2,3};
double b[] = {1.0,2.0,3.1};
cout << sumArray(a,3) << endl;
cout << sumArray(b,3) << endl;
cout << sumArray(a,3,10) << endl;
cout << sumArray(b,3,40) << endl; //uncommenting this line gives error
return 0;
}
请注意,我必须将 s
显式转换为 T
,否则最后一个示例将丢失小数部分。
但是,此解决方案仍然不适用于 sumArray(a,3,10.1)
,因为它会将 10.1
转换为 int
,因此如果这也是一个可能的用例,则需要更准确的处理。一个使用 c++11 功能的完整示例可能是这样的
template <class T, class S = T>
auto sumArray(T arr[], int size, S s=0) -> decltype(s+arr[0])
{
int i;
decltype(s+arr[0]) res = s;
...
此模板函数的另一个可能的改进是自动扣除数组大小,请参阅 TartanLlama 的回答。
关于c++ - 如何在 C++ 中使用泛型函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32251793/
我是一名优秀的程序员,十分优秀!