wtorek, 6 grudnia 2011

Problem z iteratorem w szablonie

Załóżmy, że mamy kod jak poniżej:
template<typename T>
void foo()
{
  std::vector<t> vec;
  /// (...)
  for (std::vector<t>::iterator it = vec.begin(); it != vec.end(); ++it)
        bar(*it);
}
Jest to w miarę standardowy kod, który powinien działać od ręki. Teoretycznie. Dlaczego ten kod raz się skompiluje a raz nie i kompilator będzie miał problem z określeniem typu it?

Otóż nie wszystkie kompilatory są na tyle sprytne by określić co się tak naprawdę kryje pod szablonem. Wtedy musimy mu podpowiedzieć, że ma do czynienia z typem, czyli napisać:
typename std::vector<t>::iterator it
Wtedy zadowolimy kompilator :)

Na szczęście w C++11 można użyć przyjemnego słówka kluczowego auto, które powinno wybawić nas od takich problemów i uprzyjemnić życie, a jeśli nie możemy skorzystać z dobrodziejstw nowego standardu to lepiej mieć nawyk dopisywania typename.  Zwłaszcza jeśli spodziewamy się, że nasz kod będzie kompilowany na różnych kompilatorach (platformach).

Przy okazji będziemy mieć kolejny powód do narzekania czemu C++ jest fuj fuj :)

Brak komentarzy:

Prześlij komentarz