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の意図は、コンパイラにこれが型別であることを伝えることであり、コンパイルをスムーズに通過することができます.