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

Problem z szablonami

Ostatnio zmodyfikowano 2009-11-14 14:31
Autor Wiadomość
mephisto
Temat założony przez niniejszego użytkownika
Problem z szablonami
» 2009-11-14 11:09:18
Witam,
mam problem z szablonem.
Kompilator rzuca komunikat o bledzie
cannot convert from 'mephi::Conversion<T> *' to 'mephi::AbstractConversion<T> *'
tylko nie wiem dlaczego on nie potrafi tego skonwertowac.

Prosze o pomoc jesli ktos wie w czym lezy problem.
Ponizej zamieszczam kod.

Za kazda sluszna uwage z gory dziekuje.
C/C++
#include <cstdlib>
#include<iostream>
#include<string>
using namespace std;


/**
* @namespace mephi
*/
namespace mephi
{
    /**
    * abstract class AbstractConversion
    */
    template < class T > class AbstractConversion
    {
    public:
        AbstractConversion() { };
        AbstractConversion( const AbstractConversion & obj ) { };
        ~AbstractConversion() { };
       
        virtual void readFromFile( string fileName ) = 0;
        virtual void writeToFile( string fileName ) = 0;
        virtual void removeDuplicates() = 0;
       
        AbstractConversion & operator =( const AbstractConversion & obj ) { };
    };
   
    /**
    *  class Conversion iherits from AbstractConversion
    */
    template < class T >
    class Conversion
        : public AbstractConversion < class T >
    {
    public:
        Conversion() { };
        Conversion( const Conversion & obj ) { };
        ~Conversion() { };
       
        virtual void readFromFile( string fileName ) { };
        virtual void writeToFile( string fileName ) { };
        virtual void removeDuplicates() { };
       
        Conversion & operator =( const Conversion & obj ) { };
    };
}


int main( int argc, char * argv[] )
{
    try
    {
        using namespace mephi;
       
        //to nie dziala 
        AbstractConversion < string >* conversion =
        new Conversion < string >();
       
        //to dziala
        //Conversion<string>* conversion = new Conversion<string>();
       
       
        if( conversion )
        {
            cout << "usuwam pointer to conversion" << endl;
            delete conversion;
            conversion = NULL;
        }
    }
    catch(...)
    {
       
    }
    system( "PAUSE" );
    return 0;
}
P-11559
Elaine
» 2009-11-14 13:30:33
Hmmm...
C/C++
class Conversion
    : public AbstractConversion < class T >
Nie ma być przypadkiem:
C/C++
class Conversion
    : public AbstractConversion < T >
?

Parę innych spraw:
1. Te średniki po definicjach metod są akurat średnio potrzebne ;)
2. Jeśli konstruktor demyślny, k. kopiujący i destruktor mają być puste, to nie ma sensu ich robić, kompilator zrobi to sam.
3. Ja bym uczynił destruktor AbstractConversion<T> wirtualnym.
4. Stringi powinny być przekazywane przez const ref (const string&), aby uniknąć kopiowania.
P-11562
mephisto
Temat założony przez niniejszego użytkownika
» 2009-11-14 14:01:05
Masz absolutna racje :)

Dzieki.

ad1. Dalem sredniki bo robilem ten plik na szybko bo te szablony mam w osobnych plikach

ad.2 co do konstruktorow to tez z tego wynika bo one puste nie beda a chcialem pokazac tylko to co mi nie dziala

ad.3 Masz racje ale tutaj chyba jak nie bedzie wirtualnego desktruktora to nic sie nie straci bo ta abstrakcyjna klasa nie ma zadnych zasobow

ad. 4 co do stringow masz racje

W kazdym razie dziekuje za fachowe uwagi.

Pozdro

P-11564
Elaine
» 2009-11-14 14:31:57
3. Ale inne klasy mogą mieć, a wtedy może się zdarzyć zonk.
P-11566
« 1 »
  Strona 1 z 1