我目前通过Pluralsight上的C++课程开机,我在使用MS编译器解决VS社区2013上的模板函数示例的原因时遇到了一些麻烦,我的首选IDE CLion 1.2在Ubuntu 15.04上使用g ++。我也尝试过在OSX10.10/CLion 1.2/Xcode编译器中使用相同的错误。 (注意:CLion cmake设置为“-std = C++ 11”)VC++和g ++/Xcode之间的C++模板函数差异
简单函数采用未知数量元素的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克利翁IDE的下列误差一起表示为线22和23(两个和函数调用):
error: no matching function for call to 'sum'
伴随着一个调试器注:
note: candidate template ignored: substitution failure : deduced non-type template argument does not have the same type as the its(sic) corresponding template parameter ('unsigned long' vs 'int')
int sum(arrayvalues)
^
注真正理解,我想的第一件事是使用类型名称参数模板太:
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中遇到错误,并且让我知道正确的操作过程来实现期望的结果?
很多谢谢,任何意见将不胜感激。
什么是'arrayvalues'?它在错误消息中提到,但它不在您显示的代码中。 –
当你说“工作正常”时,你是否考虑到模板定义中缺失的大括号? –
@JoachimPileborg调试器笔记中的sum(arrayvalues)应该读取sum(数组值),这就是我输入的内容。这是我的第一个问题,我可能会遗漏一些格式化技术。 –
ajgio23