VC++和g++/Xcode之间的C++模板函数差异
C++ Template function differences between VC++ and g++/Xcode
我目前正在学习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)
{
//...
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗