VC ++和g ++ / Xcode

时间:2015-11-04 15:58:09

标签: c++ visual-studio-2013 g++ clion

我目前正在开发关于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中遇到错误,并让我知道实现的正确行动方案想要的结果?

非常感谢,任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:3)

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

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