Sprawdzanie poprawności typu szablonu klasy

0

Czy sprawdzanie typu szablonu klasy powinienem robić w jakichś wyjątkach? Czy może nie powinienem się tym przejmować? Jak to jest?

I jeszcze jedno pytanie:
Chcę przeciążyć operator pisania do strumienia wyjściowego (<<) w klasie szablonowej. Napisałem to:

W klasie Wskaznik << jest f. zaprzyjaźnioną.

ostream& operator<<(ostream& o, Wskaznik& w) {
	o<<w.o<<"|"<<w.w;
	return o;
}

i wyskakuje mi błąd, bo muszę ustalić typy dla szablonu klasy Wskaznik. Jak to napisać?

1

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>){
    ...
  }
};
0

O, dzięki, że mi wyjaśniłeś to.

Co do drógiej części pytania, to znalazłem odpowiedź na stronce:

Przykład przeciążania operatora << dla szablonu klasy:

 #include <iostream> 

using std::ostream; 

template <class T> class test; 

template <class T> 
ostream & operator<<(ostream & os, const test<T> & t){ 
  os << t.x << ' ' << t.y; 
  return os; 
} 


template <class T> 
class test{ 
  private: 
    T x, y; 
  public: 
    test(T x = 0, T y = 0):x(x), y(y){} 
    friend ostream & operator<< <>(ostream &, const test<T> &); 
}; 


int main(){ 
  test<int> x(35, 112); 
  test<double> y(34.2, 61.72); 
  std::cout << x << '\n' << y << '\n';
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1