Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

szablon stosu - błąd -> no match for call to '(Stos<double>) (int)'

Ostatnio zmodyfikowano 2011-06-13 16:53
Autor Wiadomość
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:

C/C++
#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();
    /*
            void setCur(int nowyCur);
            int getCur();
            */
    bool push( T el );
    bool pop( T el );
    bool isFull();
    bool isEmpty();
    T * wyswietl();
   
}; //Stos

Stos.cpp:
C/C++
#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;
} // konstruktor

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 );
    }
} // konstr. kop

template < typename T > Stos < T >::~Stos() {
    delete[] tablica;
} // destruktor


template < typename T > void Stos < T >::setIloscMax( int nowaIloscMax ) {
    iloscMax = nowaIloscMax;
} // setIloscMax

template < typename T > int Stos < T >::getIloscMax() {
    return iloscMax;
} // getIloscMax

/*
template <typename T> void Stos<T>::setCur(int nowyCur) {
    cur = nowyCur;
} // setNowyCur

template <typename T> int Stos<T>::getCur() {
    return cur;
} // getCur
*/

template < typename T > bool Stos < T >::push( T el ) {
    if( cur == iloscMax - 1 ) {
        return false;
    } else {
        tablica[ cur++ ] = el;
        return true;
    }
} // push

template < typename T > bool Stos < T >::pop( T el ) {
    //if(cur >= 0) {
    //*(tablica+cur--) = el;
    if( !isEmpty() ) {
        el = tablica[ cur-- ];
        return true;
    } else {
        return false;
    }
} // pop

template < typename T > bool Stos < T >::isFull() {
    if( cur == iloscMax - 1 ) {
        return true;
    } else {
        return false;
    }
} // isFull

template < typename T > bool Stos < T >::isEmpty() {
    if( cur == - 1 ) {
        return true;
    } else {
        return false;
    }
} // isEmpty

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;
    }
}; //wyswietl
main:
C/C++
#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)'
P-34098
DejaVu
» 2011-06-13 14:34:53
C/C++
while( stos.isFull() == false ) {
P-34100
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;
P-34101
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.

C/C++
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ę.
P-34102
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ę.
P-34103
Elaine
» 2011-06-13 15:13:31
<< delete >>
P-34104
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. :]
P-34105
DejaVu
» 2011-06-13 16:20:42
Szablonu nie wyciąga się do pliku *.cpp.
P-34107
« 1 » 2
  Strona 1 z 2 Następna strona