2017-03-17 10 views
-3

私はC++にはとても新しく、このエラーに遭遇しました.2行目に​​と表示されています。私はの後に別のタイプを2行目に置くことになっていますか?C++ size_typeは型名を指定していません

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

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

なぜダウン票?私の答えは上記の2つのコメントとg ++のドキュメントに示唆されています。 – user481779

関連する問題