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;
}