让我们看一下常规函数,而不是函数模板。
int add_two(int in)
{
return (in + 2);
}
函数名前的int是返回类型。如果编译器无法确定它代表一个类型,它将报告为错误。如果你有一个错字并写了
imt add_two(int in)
{
return (in + 2);
}
编译器会抱怨imt 不是一个类型。
函数模板还必须有返回类型。你有:
template<class vecType>
size_type len(vector<vecType> inVector) {
size_type vecSize = inVector.size();
return vecSize;
}
这里,函数名称前有size_type。如果编译器不能确定size_type 确实是一个类型,它就会报错。如果size_type 是已知类型,编译器将继续将该类型作为函数的返回类型。
你可以使用:
template<class vecType>
typename std::vector<vecType>::size_type len(vector<vecType> inVector) {
...
}
让编译器知道std::vector<vecType> 有一个名为size_type 的类型,并且该函数的返回值就是该类型。您将需要使用typename std::vector<vecType>::size_type,因为它是一个依赖类型名称。有关该主题的更多信息,请参阅Where and why do I have to put the "template" and "typename" keywords?。
另外,你必须在函数中修正变量vecSize的声明。
template<class vecType>
typename std::vector<vecType>::size_type len(vector<vecType> inVector) {
typename std::vector<vecType>::size_type vecSize = inVector.size();
return vecSize;
}
如果你能够使用 C++11 编译器,你可以将变量声明简化为
auto vecSize = inVector.size();