2017-03-17 88 views
-3

我对C++很陌生,我遇到了这个错误:第2行为​​。我没有得到它想要告诉我的。我是否应该在第二行添加size_type之后的其他类型?C++ size_type没有命名一个类型

template<class vecType> 
size_type len(vector<vecType> inVector) { 
    size_type vecSize = inVector.size(); 
    return vecSize; 
} 

FYI:使用gcc/g++ 4.9.2

+2

“名”在这种情况下,一个动词。这意味着'size_type'不是数据类型的名称。这意味着你还没有告诉编译器'size_type'是什么。 –

+0

'size_type'通常附加到另一个类,例如'vector :: size_type' – user4581301

+0

相关:http://stackoverflow.com/questions/4849632/vectorintsize-type-in​​-c – user4581301

回答

1

让我们来看看一个普通的功能,而不是一个函数模板。

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(); 
-2

尝试

vector<vecType>::size_type vecSize = inVector.size(); 
+0

为什么倒票?我的回答是在上面的两条评论和g ++文档中提出的。 – user481779