C ++ - _itoa не был объявлен в этой области

0

В UserProfile.h я объявил класс UserProfile...

#include <iostream>
#include <map>
#include <string>

using namespace std;

class UserProfile
{
   ...
}

тогда я определил функцию UserProfile() и оператор << в UserProfile.cpp

#include "UserProfile.h"
#include <cstdlib>

inline UserProfile::UserProfile()
    : _login("guest"), _user_level(Beginner),
      _times_logged(1), _guesses(0), _correct_guesses(0)
{
    static int id = 0;
    char buffer[16];

    _itoa(id++, buffer, 10);
    _login += buffer;
}
...
ostream& operator<<(ostream &os, const UserProfile &rhs)
{
    os << rhs.login() << ' '
       << rhs.level() << ' '
       << rhs.login_count() << ' '
       << rhs.guess_count() << ' '
       << rhs.guess_correct() << ' '
       << rhs.guess_average() << endl;
    return os;
}

Однако, когда я пытаюсь скомпилировать их, ошибка отчета g++:

g++ UserProfile.cpp E44.cpp -o main
UserProfile.cpp: In constructor ‘UserProfile::UserProfile():
UserProfile.cpp:11:27: error: ‘_itoa was not declared in this scope
     _itoa(id++, buffer, 10);

Но я включил "cstdlib"... так странно...

Кроме того, когда я хочу использовать << в моей основной cpp, ошибка отчета g++ тоже:

#include "UserProfile.h"

int main()
{
    UserProfile anon;
    cout << anon;
    ...
}

g++ доклад:

E44.cpp: In function ‘int main():


E44.cpp:6:10: error: no match for ‘operator<< (operand types are ‘std::ostream {aka std::basic_ostream<char>} and ‘UserProfile)
    cout << anon;

Я так запутался... Я сделал что-то не так?

Теги:

1 ответ

2
Лучший ответ

Правильное название функции itoa не _itoa. Однако он не может использоваться в C++. cplusplus.com говорит:

Эта функция не определена в ANSI-C и не является частью C++, но поддерживается некоторыми компиляторами.

Вместо этого используйте std :: to_string или строковые потоки.

Что касается ошибки времени компиляции в отношении оператора <<, то это потому, что вы определяете оператор в другой единицы перевода, чем тот, который имеет основную функцию, которая будет скомпилирована отдельно, я думаю, и вы не объявляете ее в файле заголовка, Для этого вам нужно объявить перегруженный оператор, желательно в том же заголовочном файле, что и заголовочный файл класса UserProfile.h.

ostream& operator<<(ostream &os, const UserProfile &rhs);

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

class UserProfile
{
    friend ostream& operator<<(ostream &os, const UserProfile &rhs);
};
  • 0
    Спасибо! После добавления объявления в UserProfile.h проблема оператора << действительно решена. Тем не менее, даже если я использую функцию itoa, ошибка g ++ по-прежнему выдает сообщение: 'itoa' не было объявлено в этой области, также я просто погуглил itoa и _itoa. Кажется, что _itoa также является законным. :)
  • 0
    @ATlaS Отредактированный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню