C ++ - std :: vector foreach - нет экземпляра перегруженной функции - PullRequest
0 голосов
/ 20 марта 2019

Я не могу понять это;Недавно я начал использовать std::for_each, но эту проблему решить очень трудно

Я получаю сообщение об ошибке для кода ниже:

**no instance of overloaded function "std::vector<_Ty, _Alloc>::push_back [with _Ty=CharacterObject *, _Alloc=std::allocator<CharacterObject *>]" matches the argument list**

код:

class Stuff
{
};  

std::vector< Stuff* > list;
list.push_back(new Stuff());
list.push_back(new Stuff());
list.push_back(new Stuff());

std::vector< Stuff* > stuffs;

std::for_each(list.begin(), list.end(), [this,level, stuff](Stuff &stuff) 
{
    ... // some conditions here
    stuffs.push_back(stuff);  << error
    stuffs.push_back(&stuff);  << also throws an error
});

Я пробовал много разных комбинаций, но с ошибками шаблона STL трудно что-либо придумать

Любая помощь, конечно, высоко ценится

sheers

[edit: там, работает какАхарм и отсутствие необходимости в недобросовестности я считаю крайне неприятным]

for (std::vector< CharacterObject* >::iterator it = spawnedCharactersObjects.begin(); it != spawnedCharactersObjects.end(); ++it)
{
    CharacterObject* characterObject = *it;
    if (characterObject->getLevel() == level)
    {
        characterObjects.push_back(characterObject);
    }
}

1 Ответ

1 голос
/ 20 марта 2019

Вот как это будет сделано правильно

#include <vector>
#include <algorithm>

class Stuff
{
};  

int main() {
    std::vector< Stuff* > list;
    list.push_back(new Stuff());
    list.push_back(new Stuff());
    list.push_back(new Stuff());

    std::vector< Stuff* > stuffs;

    std::for_each(list.begin(), list.end(), [&stuffs] (Stuff *stuff) {
        stuffs.push_back(stuff);
    });
    return 0;
}

std::for_each - это шаблонная функция вида

std::for_each(Container<Type>::iterator, Container<Type>::iterator, void(Type))

(это не правильно, но показывает связь между итератором и унарной функцией). В качестве третьего параметра он ожидает функцию с одним параметром типа Stuff *, поскольку list является контейнером, содержащим элементы этого типа. Оба типа должны быть одинаковыми. Также вы должны захватить stuffs в качестве ссылки, если вы хотите изменить его.

...