2017-03-17 111 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