Ответ 1
std::vector<T>::pop_back()
возвращает void. Вы пытаетесь вернуть его как int. Это не разрешено.
template <typename Z> Z myTemplate <Z> :: popFromVector ()
{
if (myVector.empty () == false)
return myVector.pop_back ();
return 0;
}
int main ()
{
myTemplate <int> obj;
std :: cout << obj.popFromVector();
return 0;
}
Ошибка:
error: void value not ignored as it ought to be
AFAI может видеть, что тип возврата popFromVector
НЕ является недействительным. Какой смысл в том, что мне не хватает?
Ошибка исчезнет, когда я прокомментирую этот вызов в main().
std::vector<T>::pop_back()
возвращает void. Вы пытаетесь вернуть его как int. Это не разрешено.
Это потому, что определение std::vector::pop_back
имеет возвращаемый тип void
... вы пытаетесь вернуть что-то из этого метода, который не будет работать, поскольку этот метод ничего не возвращает.
Измените свою функцию на следующую, чтобы вы могли вернуть то, что там, и удалить обратно вектор:
template <typename Z> Z myTemplate <Z> :: popFromVector ()
{
//create a default Z-type object ... this should be a value you can easily
//recognize as a default null-type, such as 0, etc. depending on the type
Z temp = Z();
if (myVector.empty () == false)
{
temp = myVector.back();
myVector.pop_back();
return temp;
}
//don't return 0 since you can end-up with a template that
//has a non-integral type that won't work for the template return type
return temp;
}
Это pop_back()
. Он имеет тип возврата пустоты. Вы должны использовать back()
для получения фактического значения. Это делается для того, чтобы избежать ненужных копий.