Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151

    [c++] Funzione Template

    Salve a tutti,
    sto cercando di realizzare una funzione template membro di una classe, che prende in input qualsiasi tipo di dato su cui è implementato l'operatore "<<" e stampi a video.

    Ecco il codice del file header

    codice:
    //Debugger.h
    namespace debugger
    {
        . . .
        class Debugger
        {
        public:
            . . .
            template<typename T> void Debugger::scrivi(T m );
    
            . . .
        };
    }
    e dell'implementazione

    codice:
    using namespace debugger;
    template<typename T> void Debugger::scrivi(T m )
    {
        cout<<m;
    }
    Per richiamare la funzione faccio così:
    codice:
    Debugger d();
    d.scrivi<int>(10);
    d.scrivi("ciao");
    Ottengo un errore in fase di link per ogni chiamata alla funzione template

    main.cpp||undefined reference to `void debugger:: Debugger::scrivi<int>(int)'|
    main.cpp||undefined reference to `void debugger:: Debugger::scrivi<char const*>(char const*)'|

    Non riesco a capire dov'è il problema.
    Ringrazio anticipatamente

  2. #2

    Re: [c++] Funzione Template

    Originariamente inviato da senise

    Per richiamare la funzione faccio così:
    codice:
    Debugger d();
    Stai dichiarando la funzione "d" senza argomenti che restituisce un oggetto di tipo "Debugger".

    Per definire una variabile di tipo Debugger, fai così:
    codice:
    Debugger d;

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151
    In realta l'esempio che ho postato è semplificato per porre l'attenzione sul problema invece che su codice che funziona e nel semplificarlo ho lasciato le parentesi tonde, poichè il costruttore originale prende alcuni parametri.Il problema non è nell'oggetto che creo ( d ) poichè riesco a chiamare altri metodi della classe.

  4. #4
    Posta esattamente il codice che ti crea il problema, altrimenti è difficile intuire una possibile soluzione al tuo problema. Se lo avessi fatto anche prima probabilmente il tuo problema sarebbe gia' risolto ;-)

    ah il seguente, funge (ho tolto "Debugger::" nella dichiarazione di "scrivi"):
    Codice PHP:
    // $ gcc --version
    // i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    //
    // $ g++ -ansi -pedantic -Wextra -Wconversion main.cpp
    //
    // $ ./a.out 
    // 10ciao
    //

    #include <iostream>
    using namespace std;
    namespace 
    debugger
    {
        class 
    Debugger
        
    {
        public:
            
    template<typename Tvoid scrivi(T m );
        };
    }

    using namespace debugger;
    template<typename Tvoid Debugger::scrivi(T m )
    {
        
    cout<<m;
    }

    int main (){
        
    Debugger d;
        
    d.scrivi<int>(10);
        
    d.scrivi("ciao");


  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151
    Ok, hai ragione, non volevo incasinare troppo la discussione, con tutto il codice.
    Ecco una parte più significativa:

    Debugger.h
    codice:
    using namespace std;
    
    namespace debugger
    {
        enum Attivo {on,off};
        enum Modo{append,nuovo};
    
        struct funzione;
    
        class Debugger
        {
        public:
            /*
            METODI PUBBLICI DISPONIBILI AGLI UTENTI
            */
            Debugger(string nomefile,Modo modo);
            void insert(string nomeFile,string nomeFunzione,Attivo intest,Attivo mess);
            void insert(string nomeFunzione,Attivo intest,Attivo mess);
            void start(string nomeFile,string nomeFunzione);
            void end(string nomeFile,string nomeFunzione);
            template<typename T> void scrivi(T m );
         
         private:
             /*
                Dichiarazione membri privati
                . . . 
             */
         };
    }
    debugger.cpp
    codice:
    #include "Debugger.h"
    
    using namespace debugger;
    
    Debugger::Debugger(string nomefile,Modo modo)
    {
      //Implementazione
    }
    
    template<typename T> void Debugger::scrivi(T m )
    {
        mess<<m;
        FILEoutput=new ofstream(fileOutput.c_str() ,fstream::app);
        *FILEoutput << mess.str();
        mess.str("");
    }

    file main.cpp
    codice:
    #include "Debugger.h"
    
    using namespace std;
    using namespace debugger;
    
    int main()
    {
        Debugger d("debug.txt",nuovo);    //OK
        d.insert("main.cpp","main",on,on); //OK
    
        d.scrivi<int>(10);  //OK in compilazione, errore di Linking
        d.scrivi("ciao");    //OK in compilazione, errore di Linking
    
        return 0;
    }

  6. #6
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao . . . Le funzioni/metodi template devono essere trattate come funzioni/metodi inline poichè il compilatore deve essere in grado di espanderle e parametrizzarle a compile time . . . Prova a mettere le definizioni delle funzioni nell' header dove le hai dichiarate . . .
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151
    Grazie mille ragazzi, ho risolto proprio in questo modo, ovvero implementando la funzione direttamente nel file Header.

    Grazie a tutti
    Saluti

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 © 2025 vBulletin Solutions, Inc. All rights reserved.