C ++重载输出运算符

时间:2011-10-19 01:03:40

标签: c++ operator-overloading

我有一个如下所示的头文件:

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

1 个答案:

答案 0 :(得分:3)

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

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

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