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++;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

简单函数接受一个包含未知数量元素的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;
}
然而,在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以及一些额外的许可有关?