以下の変態プログラムでテンプレートパラメータの挙動についてご確認ください
#include <iostream>
using namespace std;

template < class T > class foo {
public:
foo() : x( 0 ) {};
foo( foo *p ) : x( p ) {};
template < class T > foo &bar( foo<T> &t ){
cout << t.member << endl;
return *x;
}
T member;
foo *x;
};

int main() {
foo< int > base;
base.member = 1000;

foo< int > i(&base);
foo< char > c;
i.member = 1;
c.member = 'a';

foo< int > r = i.bar( c );
cout << r.member << endl;
}