szablon stosu - błąd -> no match for call to '(Stos<double>) (int)'
Ostatnio zmodyfikowano 2011-06-13 16:53
devv Temat założony przez niniejszego użytkownika |
szablon stosu - błąd -> no match for call to '(Stos<double>) (int)' » 2011-06-13 14:29:15 Napisałem program implementujący szablon stosu.
Program podzielony na trzy pliki:
Stos.h:
#include <iostream> #include <ctime> #include <cstdlib> #include <iostream>
using namespace std; template < typename T > class Stos { private: T * tablica; int iloscMax; T cur; public: Stos( int n ); Stos( const Stos & drugiStos ); ~Stos(); void setIloscMax( int nowaIloscMax ); int getIloscMax(); bool push( T el ); bool pop( T el ); bool isFull(); bool isEmpty(); T * wyswietl(); };
Stos.cpp:
#include <iostream> #include <cstdlib> #include "Stos.h"
using namespace std; template < typename T > Stos < T >::Stos( int n ) { tablica = new T[ n ]; iloscMax = n; cur = - 1.0; }
template < typename T > Stos < T >::Stos( const Stos < T > & drugiStos ) { iloscMax = drugiStos.iloscMax; cur = drugiStos.cur; tablica = new T[ iloscMax ]; for( int i = 0; i < iloscMax; ++i ) { *( tablica + i ) = *( drugiStos.tablica + i ); } }
template < typename T > Stos < T >::~Stos() { delete[] tablica; }
template < typename T > void Stos < T >::setIloscMax( int nowaIloscMax ) { iloscMax = nowaIloscMax; }
template < typename T > int Stos < T >::getIloscMax() { return iloscMax; }
template < typename T > bool Stos < T >::push( T el ) { if( cur == iloscMax - 1 ) { return false; } else { tablica[ cur++ ] = el; return true; } }
template < typename T > bool Stos < T >::pop( T el ) { if( !isEmpty() ) { el = tablica[ cur-- ]; return true; } else { return false; } }
template < typename T > bool Stos < T >::isFull() { if( cur == iloscMax - 1 ) { return true; } else { return false; } }
template < typename T > bool Stos < T >::isEmpty() { if( cur == - 1 ) { return true; } else { return false; } }
template < typename T > T * Stos < T >::wyswietl() { if( tablica[ 0 ] == NULL ) { cout << "Stos jest pusty" << endl; } else { int i; for( i = 0; i < iloscMax - 1; i++ ) { cout << tablica[ i ] << "," << endl; } cout << tablica[ i ] << endl; } };
main:
#include <iostream> #include <ctime> #include <cstdlib> #include "Stos.h"
using namespace std;
int main() { Stos < double > stos( 10 ); srand( time( NULL ) ); while( stos( 10 ).isFull() == false ) { stos.push( rand() * 15 ); } system( "PAUSE" ); return 0; }
Wyskakuje mi bład w mainie w linijce:
while(stos(10).isFull()==false) {
bład: no match for call to '(Stos<double>) (int)'
|
|
DejaVu |
» 2011-06-13 14:34:53 while( stos.isFull() == false ) {
|
|
devv Temat założony przez niniejszego użytkownika |
» 2011-06-13 14:40:10 hmm, jak tak zrobiłem to pokazało mi 5 błędów:
undefined reference to `Stos<double>::Stos(int)'
do linii: Stos<double> stos(10);
undefined reference to `Stos<double>::push(double)'
do linii: stos.push(rand()*15);
undefined reference to `Stos<double>::isFull()'
do linii: while(stos.isFull()==false) {
i dwa razy:
undefined reference to `Stos<double>::~Stos()'
do linii: return 0;
|
|
absflg |
» 2011-06-13 15:04:36 Nigdy tego nie tworzyłem, ale wiem, że szablony działają na poziomie kompilatora, a nie są przekształcane do postaci binarnej. Krótkie buszowanie w googlu powiedziało mi, że należy wszystko pisać w pliku nagłówkowym, a nie *.cpp i treści metod wpisywać wewnątrz definicji klasy.
template < typename T > class test { public: test( int n ) { tresc; } test( T n ) { tresc; } dodaj( T n, int m ) { tresc; } };
Coś takiego o ile się nie mylę. |
|
devv Temat założony przez niniejszego użytkownika |
» 2011-06-13 15:12:16 wydaje mi się, że to nie to. Na zajęciach robiliśmy jeden szablon tylko, że w jednym pliku wszystko (a okazuje się, że to różnica). I tam przy konstruktorze, konstruktorze kopiującym i destruktorze nie pisaliśmy <T> .
EDIT: Zaktualizowałem plik nagłówkowy z pierwszego posta, bo wkleiłem złą wersję. |
|
Elaine |
» 2011-06-13 15:13:31 << delete >> |
|
devv Temat założony przez niniejszego użytkownika |
» 2011-06-13 15:18:15 EDIT:
Dopiero teraz zobaczyłem EDITa absflg i to działa ;-) . Ale w takim razie co ma być w pliku *.cpp? Jest on w ogóle mi teraz potrzebny?
wielkie dzięki już teraz. :] |
|
DejaVu |
» 2011-06-13 16:20:42 Szablonu nie wyciąga się do pliku *.cpp. |
|
« 1 » 2 |