2015-11-04 48 views
0

我目前通过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中遇到错误,并且让我知道正确的操作过程来实现期望的结果?

很多谢谢,任何意见将不胜感激。

+0

什么是'arrayvalues'?它在错误消息中提到,但它不在您显示的代码中。 –

+0

当你说“工作正常”时,你是否考虑到模板定义中缺失的大括号? –

+0

@JoachimPileborg调试器笔记中的sum(arrayvalues)应该读取sum(数组值),这就是我输入的内容。这是我的第一个问题,我可能会遗漏一些格式化技术。 – ajgio23

回答

3

std::array的非类型模板参数应该是std::size_t而不是int

template<std::size_t n> 
//  ^^^^^^^^^^^ 
int sum(array<int, n> values) 
{ 
    //... 
} 
+0

谢谢,你碰巧意识到在这种情况下究竟是什么使两种编译器不同,以及为什么VC++工作和g ++没有这样做? – ajgio23

+0

@ ajgio23我不完全确定,也许与他们如何定义'std :: size_t'以及一些额外的宽容有关? – TartanLlama