2011-10-19 9 views
4

J'ai un fichier d'en-tête qui ressemble à ceci:C++ Surcharger opérateur de sortie

#pragma once 

//C++ Output Streams 
#include <iostream> 

namespace microtask 
{ 
    namespace log 
    { 
     /** 
     * Severity level. 
     */ 
     enum severity 
     { 
      debug, 
      info, 
      warning, 
      error, 
      critical 
     }; 

     /** 
     * Output the severity level. 
     */ 
     std::ostream& operator<<(std::ostream& out, const severity& level); 
    } 
} 

et un fichier source qui ressemble à ceci:

//Definitions 
#include "severity.hpp" 

//Namespaces 
using namespace std; 
using namespace microtask::log; 

std::ostream& operator<<(std::ostream& out, const severity& level) 
{ 
    switch(level) 
    { 
    case debug: 
     out << "debug"; 
     break; 
    case info: 
     out << "info"; 
     break; 
    case warning: 
     out << "warning"; 
     break; 
    case error: 
     out << "error"; 
     break; 
    case critical: 
     out << "critical"; 
     break; 
    default: 
     out << "unknown"; 
     break; 
    } 

    return out; 
} 

que je suis en train de compiler dans une bibliothèque dynamique . Malheureusement, la liaison échoue avec ce message d'erreur:

undefined reference to `microtask::log::operator<<(std::basic_ostream<char, std::char_traits<char> >&, microtask::log::severity const&)' 

Qu'est-ce que je fais mal? J'ai vérifié d'autres questions de stackoverflow.com qui semblaient similaires, mais autant que je peux dire, j'ai le format pour surcharger l'opérateur correct.

Répondre

3

Dans votre fichier .cpp, ne dites pas using, mais déclarer l'espace de noms approprié:

namespace microtask 
{ 
    namespace log 
    { 
     ::std::ostream & operator<<(::std::ostream& out, const severity& level) 
     { 
      // ... 
     } 
    } 
} 

En fait, ne dites pas using avec désinvolture tout si vous pouvez l'aider. À mon avis, il devrait être réservé pour les demandes d'identification de membre de base explicites et ADL.

+0

Eh bien, cela fonctionne. Maintenant, pour ne pas refaire la même erreur, pourquoi ça ne fonctionnait pas avant? (J'accepte votre réponse dès que le délai est écoulé). –

+0

Vous définissiez ':: operator <<', plutôt que 'microtask :: log :: operator <<'. C'est juste une fonction séparée, et celle dont vous avez besoin était toujours manquante. La solution permanente que même vos petits-enfants seront reconnaissants est de ne jamais utiliser 'using' :-) –

+0

ah, je vois, eh bien, cela a du sens je suppose. Idk, ça m'a un peu ébranlé parce que j'avais l'habitude de déclarer des implémentations pour des méthodes de classe comme ça. –

Questions connexes