テンプレートについて質問です。

typedef vector< vector< shared_ptr<MyClass> > > DoubleList;

このDoubleListはあちこちで使っていたところ、プログラムサイズが馬鹿でかくなってしまいました。
ちょっと思いついたことがあり

class DoubleList
{
public:
vector< vector< shared_ptr<MyClass> > > m_list;

void push_back(MyClass &s);
//その他、vectorに存在する色々な関数を宣言。
};

として、関数群の実体をcppファイル側に書いてみました。
そうしたところ、プログラムサイズは劇的に小さくなりました。

「まさか前者のやりかただと、各.cpp毎でテンプレートを展開しDoubleListクラスを作ってしまうのか?」
と思っているのですが、この認識は正しいでしょうか?

それまでの自分の認識ですと、<>内が同じテンプレートがあちこちで使われていたとしても、コンパイラが1つだけ実体を作ってくれる。
という認識だったのですが…。

3重テンプレートが悪いのかと思い、
typedef vector< shared_ptr<MyClass> > SingleList;
typedef vector< SingleList > DoubleList;
としてみてもダメでした。