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

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

本文关键字:函数 C++ g++ Xcode 之间 VC++      更新时间:2023-10-16

我目前正在学习Pluralsight上的C++课程,我很难弄清楚为什么模板函数示例使用MS编译器在VS Community 2013上运行,而不是在我喜欢的CLion 1.2 IDE上使用Ubuntu 15.04上的g++。我也在OSX10.10/CLion 1.2/Xcode编译器上尝试过同样的错误。(注意:CLion cmake设置为"-std=c++11")

这个简单函数获取一个未知数量元素的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和OSXCLion IDE的第22行和第23行(两个sum函数调用)都显示了以下错误:

错误:调用"sum"没有匹配函数

附带调试器注释:

注意:忽略了候选模板:替换失败:推导出的非类型模板参数与其(原文如此)对应的模板参数的类型不同('unsigned long'vs'int')
int sum(数组值)
^

请注意,我真正理解的是,我尝试的第一件事也是为模板使用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中遇到错误,并让我知道实现所需结果的正确做法吗?

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

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

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