c++重载输出操作符

C++ Overloading Output Operator

本文关键字:操作符 输出 重载 c++      更新时间:2023-10-16

我有一个头文件,看起来像这样:

#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问题,似乎类似,但据我所知,我有重载操作符的格式正确。

在.cpp文件中,不要说using,而是声明正确的名称空间:

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

事实上,如果可以的话,不要随便说using。在我看来,它应该保留给显式的基本成员取消隐藏和ADL请求。