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.
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é). –
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' :-) –
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. –