Wyjątki powinno się stosować w przypadku błędów pojawiających się w trakcie wykonywania programu, spowodowanych "światem zewnętrznym", np. błędnym wprowadzeniem danych, problemem z alokacją pamięci, bądź kłopotem z otwarciem pliku. W przypadku szablonu klasę znasz już na etapie kompilacji, więc zgłaszanie wyjątków w tym wypadku było by błędem projektowym. Jeżeli masz np. taką klasę:
template <typename T>
struct dodaj{
T operator(const T& a, const T& b){
return a+b;
}
};
to próba użycia tej klasy z klasą nie przeciążającą operatora + spowoduje błąd kompilacji, więc nie trzeba wprowadzać dodatkowych testów. Jeżeli chcesz sprawdzić jakiś inny warunek w szablonie najwygodniej jest użyć tzw. static assert, występującego w bibliotece Boost oraz w C++0x http://pl.wikipedia.org/wiki/C%2B%2B0x#Statyczne_asercje. Dzięki temu błąd wystąpi wtedy, kiedy powinien, czyli podczas kompilacji.
Jeżeli dobrze rozumiem o co Ci chodzi, to ja bym zrobił tak w klasie wskaźnik (uwaga, nie chciało mi się tego sprawdzić):
template <typename T>
class Wskaznik{
...
template <typename U>
friend ostream& operator<<(ostream&,Wskaznik<U>){
...
}
};