C++;VC和x2B之间的模板功能差异+;和g++/Xcode 我目前正在PulalValk上通过C++课程,我很难理解为什么模板函数示例使用MS编译器在VS社区2013上工作,而不是在我的首选的IDE 1.2上使用Gu++在Ubuntu 15.04上。我还尝试了OSX10.10/CLion 1.2/Xcode编译器,但出现了相同的错误。(注意:CLion cmake设置为“-std=c++11”)
简单函数接受一个包含未知数量元素的STL数组,并返回所有元素的总和 代码是:C++;VC和x2B之间的模板功能差异+;和g++/Xcode 我目前正在PulalValk上通过C++课程,我很难理解为什么模板函数示例使用MS编译器在VS社区2013上工作,而不是在我的首选的IDE 1.2上使用Gu++在Ubuntu 15.04上。我还尝试了OSX10.10/CLion 1.2/Xcode编译器,但出现了相同的错误。(注意:CLion cmake设置为“-std=c++11”),c++,visual-studio-2013,g++,clion,C++,Visual Studio 2013,G++,Clion,简单函数接受一个包含未知数量元素的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 resul
#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;
}
然而,在Ubuntu和OSX CLion IDE上,第22行和第23行(两个求和函数调用)显示了以下错误:
错误:没有用于调用“sum”的匹配函数
随附调试器注释:
注意:已忽略候选模板:替换失败:推断的非类型模板参数的类型与its(sic)对应的模板参数的类型不同(“unsigned long”vs“int”)整数和(数组值)
^ 请注意,我真正理解的是,我尝试的第一件事也是为模板使用typename参数:
template<typename T, T n>
T sum(array<T, n> values)
{
int result = 0;
for (auto value : values)
{
result += value;
}
return result;
}
模板
T和(数组值)
{
int结果=0;
用于(自动值:值)
{
结果+=数值;
}
返回结果;
}
并称之为:
cout << sum<int>(numbers) << endl;
coutstd::array
的非类型模板参数应该是std::size\u t
,而不是int
template<std::size_t n>
// ^^^^^^^^^^^
int sum(array<int, n> values)
{
//...
}
模板
// ^^^^^^^^^^^
整数和(数组值)
{
//...
}
std::array的非类型模板参数应该是std::size\t
,而不是int
template<std::size_t n>
// ^^^^^^^^^^^
int sum(array<int, n> values)
{
//...
}
模板
// ^^^^^^^^^^^
整数和(数组值)
{
//...
}
什么是数组值
?错误消息中提到了它,但您显示的代码中没有提到。当您说“工作正常”时,您是否考虑到模板定义中缺少的右括号?@JoachimPileborg sum(arrayvalues)在调试器注释中应为sum(arrayvalues),这就是我键入的内容。这是我的第一个问题帖子,我可能遗漏了一些格式化技术。@MadPhysician谢谢你,纠正了我糟糕的抄写什么是arrayValue
?错误消息中提到了它,但您显示的代码中没有提到。当您说“工作正常”时,您是否考虑到模板定义中缺少的右括号?@JoachimPileborg sum(arrayvalues)在调试器注释中应为sum(arrayvalues),这就是我键入的内容。这是我的第一个问题帖子,我可能遗漏了一些格式化技术。@MadPhysician谢谢你,更正了我糟糕的抄写。谢谢,你知道这两个编译器在这个例子中到底有什么不同吗?为什么VC++工作而g++不工作?@ajgio23我不太确定,也许与他们如何定义std::size_t以及一些额外的权限有关?谢谢你,你是否知道这两个编译器在这个例子中的不同之处,以及为什么VC++工作而g++不工作?@ajgio23我不太确定,也许与他们如何定义std::size\t以及一些额外的许可有关?