‘pos’ не был объявлен в этой области

Получение этой ошибки в настоящее время:

main.cpp: In function ‘std::string class_name(const std::type_info&)’:
main.cpp:43:45: error: ‘pos’ was not declared in this scope
  if (const size_t pos = name.find(prefix)); pos != string::npos)

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

Код:

#include <string>
#include <map>
#include <array>
#include <vector>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <typeinfo>

using namespace std;

void horizontal_line(size_t n = 80)
{
    cout << endl << string(n, '-');
}

void pause(size_t n = 80)
{
    horizontal_line(n);
    cout << "\n[Enter] to continue.";
    cin.get();
}

string currency(const float& amount)
{
    ostringstream ss;
    ss.imbue(std::locale(""));
    ss << showbase << put_money(amount * 100);
    return ss.str();
}

string class_name(const type_info& typeinfo)
{
    static const string prefix("class ");
    static const size_t length = prefix.size();

    string name(typeinfo.name ());
    if (const size_t pos = name.find(prefix)); pos != string::npos)
    name.erase(pos, length);
    return name;
}


Пытаясь скомпилировать его, чтобы отобразить вывод для списка транспортных средств, но возникли некоторые проблемы с этой частью, вывод, очевидно, не будет компилироваться в данный момент с этой ошибкой. (Очевидно, это не полный код)

Какую версию компилятора вы используете? Инициализация if не будет работать до Visual Studio 2017.

zdan 08.06.2019 02:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
970
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

У вас точка с запятой сразу после if. Таким образом, pos появляется во второй раз, но не в блоке if, который является единственным местом, где pos может быть в области видимости.

Если вы имеете в виду эту часть if (const size_t pos = name.find(prefix)); pos != string::npos) я получаю другие ошибки, если я беру его, говорит, что ожидает ; до ) до поз.

Agony 08.06.2019 02:14
Ответ принят как подходящий

Если я правильно понимаю ваш код, вероятно, это то, что вы хотели сделать:

size_t pos = name.find(prefix);

if (pos != string::npos)
    name.erase(pos, length);

Синтаксис, который вы пытаетесь использовать для объявить AND инициализироватьpos внутри оператора if:

if (const size_t pos = name.find(prefix)); pos != string::npos)

Допустимо только в C++17 и более поздних версиях. Кроме того, у вас есть ошибочный ) перед ;, который вам нужно удалить, правильное утверждение:

if (const size_t pos = name.find(prefix); pos != string::npos)

Для более ранних версий C++ вам необходимо отделить декларация оператора pos от оператора if:

const size_t pos = name.find(prefix);
if (pos != string::npos)

В качестве альтернативы вы можете выполнить назначение из pos внутри оператора if, но не декларация, однако синтаксис немного отличается:

size_t pos;
if ((pos = name.find(prefix)) != string::npos)

Я даже не подумал о приятной функции C++17, позволяющей свести область видимости к минимуму. Кажется очевидным, что это действительно то, к чему стремился ОП.

Ted Lyngmo 08.06.2019 02:33

Другие вопросы по теме