そりゃお前、Tの型はコンパイル時に決まっているからだよ。
お前のやっているのは、以下と同じだ。


void sub1(const vector<int>& a) ;
void sub2(const vector<vector<int> >& a) ;


int main()
{
vector<int> s;
vector<vector<int> > d;

sub1(s) ;
sub1(d) ; // エラー
sub2(s) ; // エラー
sub2(d) ;
}

Tの型はコンパイル時に決まっているから、
vector<int>はvector< vector<int> >に変換できないし、その逆もできない。

お前の問題を解決するには、コンパイル時の条件分岐が必要だ。
C++ Template Metaprogrammingでも読め。