C++で型を決める
#include<iostream>
using namespace std;
template<typename T>
struct Iter
{
typedef T value_type;
T* ptr;
Iter(T* p=0):ptr(p){}
T& operator*() const
{
return *ptr;
}
};
template<class I>
typename I::value_type // func
func(I item)
{
return *item;
}
int main()
{
Iter<int> t(new int(10));
cout<<func(t)<<endl;
int *tt;
tt=new int(10);
cout<<*tt<<endl;
cout<<tt<<endl;
return 0;
}
Iterクラスを定義し、typedef T value_typeは埋め込み型別宣言です.
注意typename I::value_typeは関数funcの戻りタイプであり、typenameというキーワードが必要です.
Tはtemplateパラメータであるため,コンパイラによって具体化される前に,コンパイラはTについて何も知らなかった.つまりコンパイラの姿勢がわからないtypeは型別を表しています
またはmember functionまたはdata memberです.キーワードtypenameの意図は、コンパイラにこれが型別であることを伝えることであり、コンパイルをスムーズに通過することができます.