slawkow68 Temat założony przez niniejszego użytkownika |
Konkretyzacja szablonu na żądanie » 2012-03-03 16:45:28 Witam,
natknąłem się na taki aspekt, jakim jest konkretyzacja szablonu(funkcji, klasy) na żądanie (bez tworzenia żadnego obiektu, wywoływania funkcji).
Ale niestety nie chcę mi się program skompilować;/
template < typename T > bool mniejszy( T o1, T o2 ) { if( o1 < o2 ) return true; return false; }
template bool mniejszy < int >( int, int );
Podobnie jest z szablonami klas. Wyrzuca błąd: "Expected primary-expresion before 'template'". Kompilator to gcc 4.4.1;
Jaki jest poprawny sposób na wykonanie tego?
|
|
DejaVu |
» 2012-03-03 16:49:47 bool mniejszy( int, int ) { return false; }
/edit:
Inny przykład:
#include <cmath>
struct VECTOR2 { double x, y; double Dlugosc() const { return sqrt( x * x + y * y ); } };
template <> VECTOR2 max( VECTOR2 vWektor1, VECTOR2 vWektor2 ) { return( vWektor1.Dlugosc() >= vWektor2.Dlugosc() ? vWektor1 : vWektor2 ); }
Źródło: http://xion.org.pl/files/texts/mgt/html/2_4.html |
|
slawkow68 Temat założony przez niniejszego użytkownika |
» 2012-03-03 18:03:13 Nie chodzi mi w żadnym razie o szablony specjalizowane. Chodzi mi bardziej o możliwość skompilowania szablonu dla konkretnych typów, np. żeby ten szablon skompilować dla intów, double, i np. std::stringów, żeby otrzymać już skompilowane funkcje (w postaci plików *.o), jakby stworzenie "biblioteki?". |
|
DejaVu |
» 2012-03-03 18:15:58 bool mniejszy( int a, int b ) { return mniejszy < int >( a, b ); } |
|
Mrovqa |
» 2012-03-03 19:47:25 Kompilator tworzy sobie konkretną funkcję/klasę z szablonu tylko wtedy, gdy zajdzie potrzeba, tzn. wywołanie funkcji, pobranie jej adresu, czy definicja obiektu jakiejś tam klasy. Możesz zrobić nieużywaną funkcję, w której znajduje się kupa odwołań się do tych funkcji/klas (albo w jednej z nich dać np. if( false ) { } Pozdrawiam, Mrowqa |
|
slawkow68 Temat założony przez niniejszego użytkownika |
» 2012-03-03 20:08:04 Dzięki za odpowiedzi, można w sumie w w.w. sposoby to zrobić, ale "najładniej" to chyba:
template class nazwa_szablonu_klasy<int>; template bool nazwa_szablonu_funkcji<int>(int, int);
Mój błąd polegał na tym, że jedno polecenie umieściłem w "mainie", a w drugim zapomniałem <int> po nazwie funkcji. Wykładowca kiedyś rzucił pytanie na sale, jak przekazać komuś szablon klasy, bez podawania kodu źródłowego (ale zakładając, że ten ktoś wie dla jakich typów będzie naszą klase chciał parametryzować), no i chodziło mi to po głowie w sumie;) |
|
« 1 » |