2011-11-09 7 views
13

標準コンテナのvalue_typeをどのように使用するのですか?
私はそうのようにそれを使用しようとしました:テンプレート化されたパラメータのvalue_typeの使用

#include <vector> 

using namespace std; 

template <typename T> 
class TSContainer { 
private: 
     T container; 
public: 
     void push(T::value_type& item) 
     { 
       container.push_back(item); 
     } 
     T::value_type pop() 
     { 
       T::value_type item = container.pop_front(); 
       return item; 
     } 
}; 
int main() 
{ 
     int i = 1; 
     TSContainer<vector<int> > tsc; 
     tsc.push(i); 
     int v = tsc.pop(); 
} 

しかし、これは、その結果:私はこれはVALUE_TYPEがために何であったかと思いました::

prog.cpp:10: error: ‘T::value_type’ is not a type 
prog.cpp:14: error: type ‘T’ is not derived from type ‘TSContainer<T>’ 
prog.cpp:14: error: expected ‘;’ before ‘pop’ 
prog.cpp:19: error: expected `;' before ‘}’ token 
prog.cpp: In function ‘int main()’: 
prog.cpp:25: error: ‘class TSContainer<std::vector<int, std::allocator<int> > >’ has no member named ‘pop’ 
prog.cpp:25: warning: unused variable ‘v’ 

+0

[テンプレートとタイプ名]キーワードをどこで、どこに入れなければならないのですか?(http://stackoverflow.com/questions/610245/where-and-why-do-i-haveテンプレートと型名のキーワードを入れて) –

+1

再利用可能なライブラリコードを書いているとき(あるいはこれまで)、 'using namespace std;'と言うのはお勧めできません。正しい名前空間を書き出してください。 –

+0

@KerrekSB:これは例でした。 –

答えて

21

あなたはtypenameを使用する必要がありますように

typename T::value_type pop() 

をして。

理由は、T :: value_typeがメンバ変数の型かどうかを知ることができないためです(誰も型の定義を妨げずにテンプレートに渡すことができません)。しかし、その機能がなければ、コードは解析できません(何らかの識別子が型または変数を指定しているかどうかによって構文の意味が変わります)。たとえばT * pは乗算またはポインタ宣言です。したがって、タイプまたは変数のいずれかであり、接頭辞「typename」によって明示的にタイプとしてマークされていないすべてのものは、変数とみなされます。

+0

説明をありがとう! –

+0

@Jonathan:詳細については、このFAQも参照してください:[テンプレートの 'typename'キーワードは何ですか?](http://www.comeaucomputing.com/techtalk/templates/#typename) – ildjarn

7

実際にタイプであることを示すには、typenameキーワードを使用してください。

void push(typename T::value_type& item) 

typename T::value_type pop() 
関連する問題