Получение этой ошибки в настоящее время:
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. Таким образом, pos появляется во второй раз, но не в блоке if, который является единственным местом, где pos может быть в области видимости.
Если вы имеете в виду эту часть if (const size_t pos = name.find(prefix)); pos != string::npos) я получаю другие ошибки, если я беру его, говорит, что ожидает ; до ) до поз.
Если я правильно понимаю ваш код, вероятно, это то, что вы хотели сделать:
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, позволяющей свести область видимости к минимуму. Кажется очевидным, что это действительно то, к чему стремился ОП.
Какую версию компилятора вы используете? Инициализация if не будет работать до Visual Studio 2017.