У меня есть два вектора
std::vector<std::string> outputStack, operatorStack;
В какой-то момент мне нужно извлечь некоторые элементы из одного стека и поместить его в другой стек.
while(operatorStack.back().compare(L_BRACKET)) {
outputStack.push_back(operatorStack.pop_back());
}
Однако eclipse выдает ошибку, недопустимые аргументы. Но работает нормально, когда я печатаю ввод.
outputStack.push_back((std::string)operatorStack.pop_back());
Теперь, зачем нужна эта типизация? Я читал (в основном в C ++ Primer), что в соответствии с C ++ 11 нужно избегать приведения типов.
std::vector::pop_back()
возвращается void
, Вам нужно получить back()
первый, затем поп это.
outputStack.push_back(operatorStack.back());
operatorStack.pop_back();
Это довольно часто встречается в стандартном контейнере библиотеки pop
функции, в целях безопасности. Возвращаемое значение value_type, как правило, подразумевает конструкцию копирования, которая может выдавать, что означает, что контейнер потеряет элемент, который не был успешно скопирован вызывающей стороной. Так pop()
а также back()
или же front()
операции разделены.
pop_back
не возвращает элемент. Он имеет пустое возвращение. Даже при том, что Затмение не жалуется, я был бы потрясен, если тот бросок скомпилирует (это, конечно, не должно).
поскольку pop_back
в C ++ на самом деле не возвращает всплывающий элемент, вам нужно захватить его с back
первый.
Вам нужно использовать std::vector::back()
чтобы получить значение последнего элемента вместо станд :: вектор :: pop_back так как pop_back просто удаляет элемент из back и возвращает void.
Также нужно сравнить std::string::compare
с std::string::npos
while(operatorStack.back().compare(L_BRACKET) == 0) {
outputStack.push_back(operatorStack.back());
operatorStack.pop_back();
}