我有一个如下所示的头文件:
#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);
}
}
和一个如下所示的源文件:
//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;
}
我正在尝试编译成动态库。不幸的是,链接失败并显示以下错误消息:
undefined reference to `microtask::log::operator<<(std::basic_ostream<char, std::char_traits<char> >&, microtask::log::severity const&)'
我做错了什么?我已经检查了其他看似相似的stackoverflow.com问题,但据我所知,我有重载操作符的格式正确。
答案 0 :(得分:3)
在.cpp文件中,不要说using
,而是声明正确的命名空间:
namespace microtask
{
namespace log
{
::std::ostream & operator<<(::std::ostream& out, const severity& level)
{
// ...
}
}
}
事实上,如果你可以提供帮助,就不要随便说using
。在我看来,它应该保留给显式的基本成员取消隐藏和ADL请求。