la surcharge d'opérateur c++ / où mettre mon code?

Aujourd'hui, j'ai surchargé le << opérateur dans une de mes classes:

#ifndef TERMINALLOG_HH
#define TERMINALLOG_HH

using namespace std;

class Terminallog {
public:

    Terminallog();
    Terminallog(int);
    virtual ~Terminallog();

    template <class T>
    Terminallog &operator<<(const T &v);

private:

};

#endif

Comme vous pouvez le voir j'ai défini l'opérateur surchargé dans mon fichier d'en-tête et je suis allé sur la mise en œuvre dans mon .cc fichier:

//stripped code

template <class T>
Terminallog &Terminallog::operator<<(const T &v) {
    cout << endl;
    this->indent();
    cout << v;
    return *this;
}

//stripped code

Par la suite j'ai créé un main.cpp fichier à l'aide de ma nouvelle classe:

#include "inc/terminallog.hh"

int main() {
    Terminallog clog(3);
    clog << "bla";
    clog << "bla";
    return 0;
}

et je suis allé sur compilying:

g++ src/terminallog.cc inc/terminallog.hh testmain.cpp -o test -Wall -Werror 
/tmp/cckCmxai.o: In function `main':
testmain.cpp:(.text+0x1ca): undefined reference to `Terminallog& Terminallog::operator<< <char [4]>(char const (&) [4])'
testmain.cpp:(.text+0x1de): undefined reference to `Terminallog& Terminallog::operator<< <char [4]>(char const (&) [4])'
collect2: ld returned 1 exit status

BAM! une stupide erreur d'éditeur de liens et je n'ai toujours aucune idée d'où il vient. J'ai joué un peu et a remarqué que le fait de mettre la mise en œuvre de mon opérateur surchargé dans mon fichier d'en-tête résout tous les problèmes. Maintenant, je suis encore plus confus qu'avant.

Pourquoi je ne peux pas mettre la mise en œuvre de la surcharge de l'opérateur dans mon .cc fichier? Pourquoi est-elle en cours d'exécution en douceur lorsque je l'ai mis dans mon fichier d'en-tête?

Confus merci d'avance

ftiaronsem

Voir stackoverflow.com/questions/3749099/...
Linker les erreurs ne sont jamais stupides - ils sont tout aussi instructif que des erreurs de compilation.
btw - ne pas mettre using namespace std; dans votre en-tête des fichiers - vous pouvez le mettre en " cc " des fichiers, et ensuite utiliser le std:: qualifier en tant que de besoin dans le fichier d'en-tête.
Merci pour ce commentaire, je peux le faire. Mais pourquoi est-il considéré comme une mauvaise pratique?
Il comprend les std espace de noms dans l'espace de noms global pour tous les clients de cet en-tête et les en-têtes inclus après la vôtre. Voir, par exemple, cette réponse: stackoverflow.com/questions/1265039/using-std-namespace/...

OriginalL'auteur ftiaronsem | 2011-03-27