typedefの前方宣言

ファイル間の依存関係を少なくするために、ポインタ渡しや参照渡しのパラメタのクラス定義を前方宣言する方法があるんだけど、どうやらtemplateを利用した場合だと出来ないみたい…
m.hのコメント部分をはずすとコンパイルエラー(C2371: 'TTT' : 再定義されています。異なる基本型です。)となる。
理由がわかんないんだけど、typedefの名前空間とダブってるとかなのかなぁ…わかんないや。参照渡しだから、クラスのサイズ分からなくても問題ないはずなんだけどなぁ。コンパイラはVC8。



def.h

class A {} ;

template<class T>
class Tem {} ;

typedef Tem<int> TTT ;

m.h

class A ;		// 前方宣言
// class TTT ;

class main_
{
public :
	void func( const A &a ) ;
//	void func1( const TTT &t ) ;
} ;


t.h

#include "main.h"
#include "def.h"

void main_::func(const A &a){ return ; }
void main_::func1( const TTT &t ){ return ; }