ошибка: пустое значение не игнорируется, как должно быть - PullRequest
20 голосов
/ 05 сентября 2011
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 ().

Ответы [ 3 ]

16 голосов
/ 05 сентября 2011

std::vector<T>::pop_back() возвращает недействительным.Вы пытаетесь вернуть его как int.Это не разрешено.

9 голосов
/ 05 сентября 2011

Это потому, что определение 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; 
}
2 голосов
/ 05 сентября 2011

Это pop_back().У него тип возврата void.Вы должны использовать back(), чтобы получить фактическое значение.Это позволяет избежать ненужных копий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...