2010-09-09 10 views
1

J'ai joué avec les fonctions de Template, et j'ai fait un petit programme de journalisation. J'ai essayé de diviser ceci en en-tête/dossier de source, mais je continue à obtenir des erreurs d'éditeur de liens. Je sais que c'est simple, mais je ne peux pas le comprendre.Erreur de lieur LNK2019

J'ai aussi quelques vars convaincre dans l'en-tête de l'enregistreur, où serait l'endroit «approprié» pour ceux? (logStart, logEnd, etc.)

Tous les codes ci-dessous.

tête

#ifndef __moot_logger_hpp__ 
#define __moot_logger_hpp__ 


#include <iostream> 
#include <fstream> 
#include <string> 

using std::ios; 

namespace Moot 
{ 
    struct Logger 
    { 
     Logger(); 
     ~Logger() {} 


     template <class T>  
     void saveToFile(T type); 

     template <typename T> 
     Logger& operator<< (T type); 


     /* 
     Logger& operator<< (std::wstring wideStr) 
     { 
      saveToFile(Moot::convertWstringToString(wideStr)); 
      return *this; 
     } 
     */ 
    }; 


    /* 
    namespace { 
     Logger logStart; 
     Logger& lStart = logStart; 

     const char logEnd = '\n'; 
     const char& lEnd = logEnd; 

     const char logSpace = ' '; 
     const char& lSpace = logSpace; 
    } 
    */ 

} 


#endif 

Source

#include <Moot/logger.hpp> 

Moot::Logger::Logger() 
{ 
    std::ofstream logfile; 
    logfile.open ("logfile.txt", ios::trunc); 
    logfile << "LogFile - most recent at the bottom\n"; 
    logfile << "-----------------------------------\n \n"; 
    logfile.close(); 
} 


template <typename T> 
void Moot::Logger::saveToFile(T type) 
{ 
    std::ofstream logfile; 
    logfile.open ("logfile.txt", ios::in | ios::app); 
    logfile << type; 
    logfile.close(); 
} 


template <typename T> 
Moot::Logger& Moot::Logger::operator<< (T type) 
{ 
    saveToFile(type); 
    return *this; 
} 


/* 
Logger::Logger& operator<< (std::wstring wideStr) 
{ 
    saveToFile(Moot::convertWstringToString(wideStr)); 
    return *this; 
} 
*/ 

principale

#include <Moot/logger.hpp> 
#include <iostream> 

int main() 
{ 
    std::cout << "hello" << std::endl; 

    Moot::Logger() << 12; 
    //Moot::lStart.saveToFile(23); 
    //Moot::lStart.operator << 13; 

    return 0; 
}; 
+2

Veuillez noter que les identifiants commençant par des traits de soulignement sont réservés. –

+2

Vous ne devez pas utiliser une directive using dans un en-tête; Cela ne fait que finir en larmes. En ce qui concerne les «variables de commodité», si elles sont utilisées uniquement dans un fichier source unique, vous devez les placer dans ce fichier source. Si elles sont utilisées dans plusieurs fichiers source, vous devez les placer dans le fichier d'en-tête, peut-être dans un espace de noms 'detail'. Personnellement, je ne suis pas un fan de l'utilisation d'une instance globale pour un enregistreur; il est beaucoup plus propre de transmettre un pointeur ou une référence (ou un pointeur intelligent, si nécessaire) à l'enregistreur aux composants qui se connectent (certaines personnes ne sont pas d'accord avec ce point de vue, cependant). –

+0

@Alexandre: '' C'est un peu plus compliqué que ça. Réservés sont tous les identifiants commençant par un trait de soulignement suivi d'une lettre majuscule, tous les identifiants dans l'espace de noms global commençant par un trait de soulignement, et tous les identificateurs ayant deux traits de soulignement consécutifs n'importe où. '' Néanmoins, plutôt que de se souvenir de ces règles, il pourrait être plus facile d'éviter complètement les traits de soulignement (et, bien sûr, plus d'un trait consécutifs), donc, fondamentalement, je suis d'accord avec vous. ('+ 1' de moi.) – sbi

Répondre

0

Si vous voulez diviser la définition de la déclaration pour les classes de modèle que la définition de déplacement vers un fichier séparé avec HPP ou TPP (TPP pas toujours traité correctement par les éditeurs de texte) l'extension et ajouter directive include pour le fichier de définition à la fin du fichier de déclaration

Questions connexes