Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] virtual e template

    Salve a tutti!
    Ho un piccolo problema, che sta rishiando di farmi saltare la sessione di laurea se devo trovare una soluzione alternativa a quella che mi da problemi.
    Sto lavorando con il SystemC che è una libreria di classi per la descrizione ad alto livello dell'hardware scritte in C++. Andiamo al sodo: premetto che in systemC ho una classe definita con un template tipo
    template<int dim>
    class sc_int {
    ...
    }
    ed adesso vi faccio vedere il codice dove risiede il problema

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <map>
    #include <vector>
    #include <sstream>

    using std::ifstream;
    using std:fstream;
    using std::string;
    using std::cout;
    using std::endl;
    using std::cin;
    using std::cerr;
    using std::string;
    using std::istringstream;
    using std::vector;


    template<int dim>
    class sc_int{
    public:
    char mess[dim];

    sc_int(char * str, int n){


    int fine = min(n,dim);
    for(int j = 0; j < fine; j++ )
    mess[j]=str[j];
    }

    char * get_mess(){
    return mess;
    }

    int min(int n, int dime){
    if(n>dime)
    return dime;
    else
    return n;
    }
    };


    class ps_power_model
    {
    public :

    ps_power_model(){
    cerr << "Error 504: Distructor not defined in derived class of ps_power_model" << endl;
    };

    virtual ~ps_power_model(){
    cerr << "Error 506: Distructor not defined in derived class of ps_power_model" << endl;
    };

    template<int dim>
    virtual void stampa(sc_int<dim> ciao)

    {
    cout << "base"<<endl;
    };

    virtual void ciao(){
    cout << "boooooooooo" << endl;
    }

    static int get_number_parameter(void){
    cerr << "Error 504: Function - get_number_parameter() - not defined in derived class of ps_power_model." << endl;
    exit(1);
    };

    };

    class ps_costant_model : public ps_power_model
    {
    public :

    static int num_param;

    ps_costant_model(){
    cerr << "Error 510: Distructor not defined in derived class of ps_power_model" << endl;
    };

    ~ps_costant_model(){
    cerr << "Error 520: Distructor not defined in derived class of ps_power_model" << endl;

    };

    void ciao(){
    cout << "Marco foreever"<<endl;
    };

    template<int dim>
    void stampa(sc_int<dim> ciao){
    cout << ciao.get_mess() << endl;
    }

    static int get_number_parameter(void){
    return num_param;
    };
    };




    int ps_costant_model::num_param(3);

    template<int dim>
    void stampa(sc_int<dim>);

    static ps_power_model * get_power_model(int);


    int main(void){


    sc_int<20> int1("messaggio 1",12);
    sc_int<40> int2("messaggio 2",12);

    stampa(int1);
    stampa(int2);
    stampa(int1);


    std::map<string, ps_power_model*> power_module_table;
    std::map<string, ps_power_model*>::iterator iter;

    ps_power_model * model;

    string ciao("ciao");


    model = get_power_model(0);


    power_module_table.insert(std:air<string,ps_power_model*>(ciao,(model)));


    iter = power_module_table.find (string("ciao"));

    if(iter != power_module_table.end())
    iter->second->stampa(int1);

    power_module_table[ciao]->stampa(int2);

    }

    template<int dim>
    void stampa(sc_int<dim> ciao){
    cout << ciao.get_mess() << endl;
    }

    static ps_power_model * get_power_model(int num_of_model){

    switch(num_of_model){

    case 0 :

    return new ps_costant_model;
    break;

    default :

    return new ps_costant_model;
    }
    };
    come potete vedere nel codice(la parte di color rosso) ho definito una funzione templetizzata VIRTUAL ed il compilatore mi da errore dicendomi
    invalid use of ‘virtual’ in template declaration of ‘virtual void ps_power_model::stampa(sc_int<dim>)’
    come posso fare in modo che quella funzione resti virtual e che continui ad essere templetizzata? è possibile?? per favore ditemi di SIIIIIII!!!!

    ps. il codice in verde l'ho inserito solo per simulare la classe presente nelle librerie del SystemC.

    Grazie

    Marco
    warcomeb - IL LEADER O.O.O.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Spiacente, ma non è possibile usare costrutti come quello che hai scritto.
    Il motivo è che il template viene istanziato a compile time e il compilatore non avendo modo di sapere con che valore verrebbe istanziata una possibile funzione in una classe derivata, dovrebbe creare nella tabella dei puntatori, una funzione per ogni singolo int possibile.

    Servirebbe comunque il codice "verde" reale, per formulare una soluzione.

  3. #3
    ma non c'è proprio nessun metodo per aggirare l'ostacolo!!! CAVOLI COSI' SONO ROVINATO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 VVoVe: VVoVe:
    warcomeb - IL LEADER O.O.O.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Un modo c'è, ma non so se puoi applicarlo al tuo caso visto che hai messo solo una classe di esempio.

    Io farei così:

    codice:
    class base_sc_int {
    	public:
                virtual char* get_mess()=0;
                virtual int min(int n, int dime)=0;
    };
    
    
    
    template<int DIM>
    class sc_int : public base_sc_int {
    	public:
    		char mess[DIM];
    
    		sc_int(char * str, int n){
    			int fine = min(n,DIM);
    			for(int j = 0; j < fine; j++ )
    				mess[j]=str[j];
    		}
    
    		char * get_mess(){
    			return mess;
    		}
    
    		int min(int n, int dime){
    			if(n>dime)
    				return dime;
    			else
    				return n;
    		}
    };
    e la funzione la modificherei così:
    codice:
    virtual void stampa(base_sc_int& ciao) {
    	cout << "base"<<endl;
    };

  5. #5
    perfetto! così funziona perfettamente e fa tutto quello che deve fare!!!!!!

    GRAZIE

    warcomeb - IL LEADER O.O.O.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.