Не в состоянии перегрузить поток вывода в C ++ - PullRequest
0 голосов
/ 29 января 2012

Я пытаюсь перегрузить оператор << в моем классе <code>STEntry, но продолжаю сталкиваться с этой ошибкой. Мой класс вставлен ниже ошибки.

stentry.h: In function ‘std::ostream& operator<<(std::ostream&, const STEntry&)’:
stentry.h:48: error: no match for ‘operator<<’ in ‘std::operator<< [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)out)), ((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)(& temp->STEntry::lexeme))) << ','’
stentry.h:46: note: candidates are: std::ostream& operator<<(std::ostream&, const STEntry&)

Мой класс в STEntry.h. Это довольно просто. Я пытаюсь отобразить некоторые значения переменных.

#ifndef __STENTRY__
#define __STENTRY__
#include <string>

using namespace std;

class STEntry {
  public:
     string lexeme; // addr. of lexema associated with this entry
     int  tokenval; // token value for this entry
     int  offset;   // location of variable in block

     STEntry(string name = "", int newval = 0, int newoffset = 0);
     // function:  constructor ... initializes major fields

     // Relational operators:
    bool operator == (const STEntry &) const;
    bool operator != (const STEntry &) const;
    friend ostream & operator << (ostream &, const STEntry &);
};

//--- BEGIN IMPLEMENTATION

//constructor
STEntry::STEntry(string name, int newval, int newoffset)
{
    lexeme = name;
    tokenval = newval;
    offset = newoffset;
}

// ....

//Output a single STEntry to standard output
std::ostream& operator << (std::ostream& out, const STEntry & temp)
{
    out << temp.lexeme << ',' << temp.tokenval << ',' << temp.offset;
    return out;
}

//--- END OF IMPLEMENTATION
#endif

Ответы [ 5 ]

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

Добавьте

#include <iostream>

в ваш файл.

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

Вы перегружены operator<< просто отлично. Это линия внутри этой функции, которая вызывает проблемы.

out << temp.lexeme << ',' << temp.tokenval << ',' << temp.offset;

Из сообщения об ошибке он не знает, как записать lexeme (a string) в поток.

Вы включили и <iostream>, и <string>? Я вижу только один из них в вашем опубликованном коде.

1 голос
/ 29 января 2012

Возможно, вы не включили потоковую библиотеку в ваш проект. Попробуйте #include <iostream> или <ostream>

1 голос
/ 29 января 2012

вам, вероятно, нужно включить iostream перед заголовком

0 голосов
/ 29 января 2012

Вы фактически должны реализовать оператор << Другими словами, вы должны написать его. </p>

Также обратите внимание, что __ в именах макросов зарезервировано для использования разработчиками компилятора и не должно использоваться.

...