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)
{
//...
}
我目前正在学习 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)
{
//...
}