VC++ 和 g++/Xcode 之间的 C++ 模板函数差异

C++ Template function differences between VC++ and g++/Xcode

我目前正在学习 Pluralsight 上的 C++ 课程,我在弄清楚为什么模板函数示例在使用 MS 编译器的 VS Community 2013 上运行时遇到了一些问题,但在我首选的 IDE CLion 1.2 在 Ubuntu 15.04 上使用 g++。我也试过在 OSX10.10/CLion 1.2/Xcode 编译器上出现同样的错误。 (注意:CLion cmake 设置为“-std=c++11”)

简单函数采用未知数量元素的 STL 数组和 returns 所有元素的总和。

密码是:

#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 行(两个求和函数调用)显示了以下错误:

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;

但这在编译时产生了同样的错误。我的尝试是错误的 this/am 我走错了方向还是这是解决问题的有效尝试?

我显然知道编译器做事的方式存在差异,但是有人能告诉我为什么我在 CLion 中遇到错误,并让我知道实现目标的正确行动方案想要的结果?

非常感谢,如有任何建议,我们将不胜感激。

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

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