C ++ Перегрузка Оператора Вывода - PullRequest
4 голосов
/ 19 октября 2011

У меня есть заголовочный файл, который выглядит так:

#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 Ответ

3 голосов
/ 19 октября 2011

В вашем файле .cpp не говорите using, а вместо этого объявляйте правильное пространство имен:

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

На самом деле, вообще не говорите using, если вы можете помочь. По моему мнению, это должно быть зарезервировано для явного отображения базового члена и запросов ADL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...