Нет оператора "<<", соответствующего этим операндам. Типы операндов std::wostream << std::string

Рейтинг: -1Ответов: 1Опубликовано: 16.06.2023

Я вывожу данные в консоль, используя "wcout". В этом коде эта ошибка появилась, когда я попытался отобразить имя "wcout<<Name.GetNickName". Пробовал и просто через "cout". Консоль показывает просто пустое место. Забив в инете по этому поводу тоже ничего нужного не сказано. Идея состоит в том, чтобы отображать имя игрока в конце игры викторины. "wcout" я использую для создания цветного текста. В define выше написано. Пробовал и писать "wcout<<L ""<<Name.GetNickName". Но и он жалуется на это.

Code not showing up in stack overflow

Code not showing up in stack overflow

//Стартовое окно
int StartWindow()
{
    int variant;
    Player SetName;
    string NickName;
    
    wcout << L"1 - Начать викторину"<<endl;
    wcout << L"2 - Закрыть окно" << endl;
    cin >> variant;
    system("cls");

    if (variant == 1)
    {
        cout << "Введите свой ник" << endl;
        cin >> NickName;
        SetName.SetNickName(NickName);
        system("cls");
        QuestionsWindow();
    }
    else
    {
        system("cls");
        cout << "Ну и больно надо! Но вы еще можете вернуться\n 1-Вернуться обратно\n 2-Уйти" << endl;
        cin >> variant;
        if (variant==1)
        {
            
            system("cls");
            StartWindow();
        }
        else
        {
            system("cls");
            cout << "Всего хорошего!"<< endl;
            return 0;
        }
        return 0;
    }

}


//Перенос из файла в вектора
void LoadData(string name, int dif)
{
    ifstream File(name);

    string readLine;
    int i = 0;

    if (!File.is_open())
    {
        cout << "Ошибка открытия файла" << endl;
    }
    else
    {
        while (getline(File, readLine))
        {
            if (i % 3 == 0)
            {
                if (dif == 0)
                {
                    EasyQuestion.Questions.push_back(readLine);
                }
                if (dif == 1)
                {
                    MediumQuestion.Questions.push_back(readLine);
                }
                if (dif == 2)
                {
                    HardQuestion.Questions.push_back(readLine);
                }
            }
            if (i % 3 == 1)
            {
                if (dif == 0)
                {
                    EasyQuestion.Answers.push_back(readLine);
                }
                if (dif == 1)
                {
                    MediumQuestion.Answers.push_back(readLine);
                }
                if (dif == 2)
                {
                    HardQuestion.Answers.push_back(readLine);
                }
            }
            if (i % 3 == 2)
            {
                if (dif == 0)
                {
                    EasyQuestion.CorrectAnswer.push_back(readLine);
                }
                if (dif == 1)
                {
                    MediumQuestion.CorrectAnswer.push_back(readLine);
                }
                if (dif == 2)
                {
                    HardQuestion.CorrectAnswer.push_back(readLine);
                }
            }
            i++;
        }
    }

    File.close();
}
bool result;
//Проверка на правильный вариант ответа
void IsAnswerCorrect(int answer, string correctAnswer)
{
    
    int correctAnswerInt = stoi(correctAnswer);
    result = answer == correctAnswerInt;
    if (result)
    {
        score++;
        wcout << L"Вы ответили правильно, ваш счет: ";
    }
    else
    {
        wcout << L"Вы ответили неправильно, ваш счет: ";
    }
}

//Окно вопросов
void QuestionsWindow()
{
   

    int choise, choise1 = 1, choise2;
    string str, line;
    

    for (int i = 0; i < 2; i++)
    {
        
        wcout << GRN << L"\t\t\t      ВЫБЕРИТЕ ОДИН ИЗ ВАРИАНТОВ\n" << WHT << endl;
        wcout << RED << L"1-Легкий вопрос\t" << L"\t2-Средний вопрос" << L"\t3-Сложный вопрос\t"<< L"\t4-Закончить Викторину" << WHT << endl;
        cin >> choise;
        int count = 0;
        int index = 0;

        while (true)
        {
            count++;
            if (choise == 1)
            {
                cout << EasyQuestion.Questions[index] << endl;
                cout << EasyQuestion.Answers[index] << endl;
                cin >> choise2;
                IsAnswerCorrect(choise2, EasyQuestion.CorrectAnswer[index]);
                if (count == EasyQuestion.Questions.size())
                {
                    wcout << BLU << L"Вы закончили этап с легкими вопросами! Нажмите ENTER чтобы перейти в меню вопросов!" << WHT << endl;
                    cin.ignore();
                    cin.get();
                    system("cls");
                    break;
                }
            }
            if (choise == 2)
            {
                cout << MediumQuestion.Questions[index] << endl;
                cout << MediumQuestion.Answers[index] << endl;
                cin >> choise2;
                IsAnswerCorrect(choise2, MediumQuestion.CorrectAnswer[index]);
                if (result == true)
                {
                    score++;
                }
                wcout << RED << score << WHT << endl;

                
                if (count == MediumQuestion.Questions.size())
                {
                    wcout << BLU << L"Вы закончили этап со средними вопросами! Нажмите ENTER чтобы перейти в меню вопросов!" << WHT << endl;
                    cin.ignore();
                    cin.get();
                    system("cls");
                    break;
                }
            }
            if (choise == 3)
            {
                cout << HardQuestion.Questions[index] << endl;
                cout << HardQuestion.Answers[index] << endl;
                cin >> choise2;
                IsAnswerCorrect(choise2, HardQuestion.CorrectAnswer[index]);
                if (result == true)
                {
                    score+=2;
                }
                wcout << RED << score << WHT << endl;
                if (count == HardQuestion.Questions.size())
                {
                    wcout << BLU << L"Вы закончили этап со сложнымы вопросами! Нажмите ENTER чтобы перейти в меню вопросов!" << WHT << endl;
                    cin.ignore();
                    cin.get();
                    system("cls");
                    break;
                }
            }

            if (choise==4)
            {
                system("cls");
                wcout << L"Спасибо вам за участие в Викторине!" << endl;
                ShowResult();
                wcout << BLU << L"Чтобы закончить Викторину нажмите ENTER..." << WHT << endl;
                cin.ignore();
                cin.get();
                exit(0);
            }
            index++;
            wcout << BLU << L"Чтобы перейти к следующему вопросу нажмите ENTER..." << WHT << endl;
            cin.ignore();
            cin.get();
            system("cls");



        }
    }
}

};

int main() {

setlocale(LC_ALL, "Rus");
int name;
Viktorina Start;
Player Name;
Start.LoadData("MyFile.txt", 0);
Start.LoadData("myfile2.txt", 1);
Start.LoadData("myfile3.txt", 2);
Start.StartWindow();
wcout << Name.GetNickName() << endl; //PROBLEM WAS HERE

system("pause");
return 0;

}

Ответы

▲ 0Принят

У вас функция string GetNickName() возвращает string, "узкую" строку. А wcout работает с "широкими", из wchar_t.

Вы должны работать либо с теми, либо с другими. Либо каждый раз выполнять преобразование (ужасное решение)...

Особенно странным выглядит применение в одной программе одновременно и cout, и wcout

cout << HardQuestion.Questions[index] << endl;
wcout << RED << score << WHT << endl;

— зачем?!!