我目前正在开发关于Pluralsight的C ++课程,我在使用MS编译器找出模板函数示例为什么在VS Community 2013上运行时遇到了一些麻烦,但在我在Ubuntu上使用g ++的我喜欢的CLion 1.2 IDE上找不到15.04。我也尝试过OSX10.10 / CLion 1.2 / Xcode编译器,但错误相同。 (注意:CLion cmake设置为" -std = c ++ 11")
simple函数接受一个未知数量元素的STL数组,并返回所有元素的总和。
代码是:
#include<array>
#include<iostream>
using namespace std;
template<int n>
int sum(array<int, n> values)
{
int result = 0;
for (auto value : values)
{
result += value;
}
return result;
}
int main()
{
array<int,5> numbers = {{1,2,3,4,5}};
array<int,3> more_numbers = {{1,3,5}};
cout << sum(numbers) << endl;
cout << sum(more_numbers) << endl;
getchar();
return 0;
}
在VS 2013中,这可以正常工作并输出预期的结果:
15
9
然而,在Ubuntu和OSX CLion IDE上,第22行和第23行(两个sum函数调用)显示以下错误:
错误:没有匹配函数来调用&#39; sum&#39;
附带调试器注释:
注意:候选模板被忽略:替换失败:推导出的非类型模板参数与其(原文如此)对应的模板参数的类型不同(&#39; unsigned long&#39; vs&#39; int&# 39)
int sum(arrayvalues)
^
请注意,我尝试的第一件事就是使用模板的typename参数:
template<typename T, T n>
T sum(array<T, n> values)
{
int result = 0;
for (auto value : values)
{
result += value;
}
return result;
}
并用:
调用它cout << sum<int>(numbers) << endl;
但是这在编译时产生了同样的错误。我是错误的尝试这个/我是朝着错误的方向前进,还是这是解决问题的有效尝试?
我很清楚编译器的工作方式之间存在差异,但是有人能够告诉我为什么我会在CLion中遇到错误,并让我知道实现的正确行动方案想要的结果?
非常感谢,任何建议都将不胜感激。
答案 0 :(得分:3)
std::array
的非类型模板参数应为std::size_t
,而不是int
。
template<std::size_t n>
// ^^^^^^^^^^^
int sum(array<int, n> values)
{
//...
}