Перегрузка на << как ошибка cout - PullRequest
0 голосов
/ 06 января 2012

Я пытаюсь создать класс типа std :: cout , однако, с цветным выводом. Идея состоит в том, чтобы вызвать colorstream, но когда я перегружаю, оператор << выдает ошибку. </p>

Коды ниже:

main.cpp

#include <colorstream/colorstream.hpp>

int main ( int argc, char **argv )
{
cpk::colorstream test;
test << "Hello World";

return 0;
}

ColorStream / colorstream.hpp

#include <string>

#ifndef CPK_COLORSTREAM_HPP
#define CPK_COLORSTREAM_HPP

namespace cpk
{
    class colorstream
    {
    public:
        colorstream ( ) { };
        colorstream operator<<( std::string n );
    };
}

#endif // #ifndef CPK_COLORSTREAM_HPP

ColorStream / colorstream.cpp

#include <string>
#include <iostream>

/**
 * CPK Color Stream Header
 */
#include <colorstream/colorstream.hpp>

cpk::colorstream::colorstream operator<<( std::string n )
{
    std::cout << n << std::endl;
}

Это первый раз, когда я пытаюсь перегрузить операторов, поэтому, пожалуйста, помогите мне, и если я смогу объяснить свою ошибку.

Спасибо, Бруно Алано

@ редактировать Ошибка:

CMakeFiles/cpk.dir/source/cpk.cpp.o: In function `main':
cpk.cpp:(.text+0x45): undefined reference to `cpk::colorstream::operator<<(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make[2]: ** [cpk] Erro 1
make[1]: ** [CMakeFiles/cpk.dir/all] Erro 2
make: ** [all] Erro 2

Ответы [ 3 ]

4 голосов
/ 06 января 2012

Ну, ошибка в том, что вы по определению оператора искажены. Должно быть

cpk :: colorstream cpk :: colorstream :: operator << (std :: string n) </p>

Тем не менее, я настоятельно рекомендую , а не , чтобы продолжить этот подход! Чтобы создать пользовательские потоки, которые вы хотите извлечь из std::streambuf, и переопределить соответствующие операции там (например, overflow() и, возможно, xsputn() для выходных потоков).

На самом деле, если вы хотите изменить цвет, например, используя ANSI Escape Codes , вы можете просто создать подходящие цветовые манипуляторы и использовать их с std::ostream:

#include <iostream>

namespace color
{
    std::ostream& red(std::ostream& out) {
        return out << "\x1b[31m";
    }
    std::ostream& reset(std::ostream& out) {
        return out << "\x1b[0m";
    }
}

int main()
{
    std::cout << "hello " << color::red << "world" << color::reset << "\n";
}

На не-UNIX платформах может понадобиться какой-то другой механизм, хотя ...

2 голосов
/ 06 января 2012

При определении оператора-члена необходимо указать имя класса, а не тип возвращаемого значения.

namespace cpk {
    colorstream colorstream::operator<<( std::string n )
    {
        std::cout << n << std::endl;
    }
}

Теперь, чтобы разрешить цепочку вызовов на <<, как вы можетедля std::cout вам необходимо вернуть значение из вашего оператора!

namespace cpk {
    colorstream colorstream::operator<<( std::string n )
    {
        std::cout << n << std::endl;
        return *this;
    }
}

Однако это вернет копию потока, потому что он возвращает значение.Это, вероятно, нежелательно, поэтому вам лучше вернуться по ссылке:

    colorstream& colorstream::operator<<( std::string n )
    {
        std::cout << n << std::endl;
        return *this;
    }
0 голосов
/ 06 января 2012

Мне нужна дополнительная информация о том, что вы пытаетесь выполнить, и какие ошибки появляются.

Я сделал предположение с помощью приведенного ниже кода, что вы хотите вывести цвет в стандартный вывод.Я чувствую, что полностью ошибаюсь в этом предположении, однако вот код ...

main.cpp

#include <colorstream/colorstream.hpp>

int main ( int argc, char **argv )
{
    cpk::colorstream test;
    test.SetColor("RED");
    std::cout << test << std::endl;

    return 0;
}

colorstream / colorstream.hpp должно быть:

#include <iostream>
#include <string>

#ifndef CPK_COLORSTREAM_HPP
#define CPK_COLORSTREAM_HPP

namespace cpk
{
    class colorstream
    {
    public:
        std::ostream& operator<< (std::ostream& stream, const cpk::colorstream& cs);
        void SetColor(const std::string &color){m_Color = color;}
    private:
        std::string m_Color;
    };
}

#endif // #ifndef CPK_COLORSTREAM_HPP

colorstream / colorstream.cpp должно быть:

#include <string>
#include <iostream>

/**
 * CPK Color Stream Header
 */
#include <colorstream/colorstream.hpp>

std::ostream& operator<<(std::ostream& stream, const cpk::colorstream& cs) 
{
    stream << cs.m_Color; 
    return stream;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...