C++, användning av std::partition

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2011

C++, användning av std::partition

Jag har ett problem med användning av std::partition. Det är så att jag har en klass Character som jag vill spara i en vector. Detta har jag gjort med hjälp

std::vector<Character> character_list{};

sedan laddar jag in mina character-objekt.

for(int i = 0; i < number_of_players; i++) { character_list.emplace_back(Character{our_matrix, i + 1}); }

Det är nu jag vill partitionera vektorn med anseende om det är vid liv eller inte. Själva kollen görs i lambda-uttrycket.

std::vector<Character>::iterator bound; bound = std::partition(character_list.begin(), character_list.end() , [](Character curr) {return curr.get_life() > 0;});

Dock verkar inte partitioneringen fungera och jag får förljande fel från kompilatorn

g++ -std=c++14 -Wpedantic -Wextra -Werror -Wall -c Game.cc -DSFML_STATIC -I SFML\include -L SFML\lib -lsfml-graphics-s -lsfml-window-s -lsfml-system-s -lopengl32 -lwinmm -lgdi32 -lfreetype -ljpeg C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/move.h: In instantiation of 'void std::swap(_Tp&, _Tp&) [with _Tp="Character"]': C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/stl_algobase.h:148:22: required from 'void std::iter_swap(_ForwardIterator1, _ForwardIterator2) [with _ForwardIterator1 = __gnu_cxx::__normal_iterator<Character*, std::vector<Character> >; _ForwardIterator2 = __gnu_cxx::__normal_iterator<Character*, std::vector<Character> >]' C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/stl_algo.h:1507:34: required from '_BidirectionalIterator std::__partition(_BidirectionalIterator, _BidirectionalIterator, _Predicate, std::bidirectional_iterator_tag) [with _BidirectionalIterator = __gnu_cxx::__normal_iterator<Character*, std::vector<Character> >; _Predicate = Game::update()::<lambda(const Character&)>]' C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/stl_algo.h:4508:43: required from '_BIter std::partition(_BIter, _BIter, _Predicate) [with _BIter = __gnu_cxx::__normal_iterator<Character*, std::vector<Character> >; _Predicate = Game::update()::<lambda(const Character&)>]' Game.cc:45:74: required from here C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/move.h:176:11: error: use of deleted function 'Character& Character::operator=(const Character&)' __a = _GLIBCXX_MOVE(__b); ^ In file included from Game.cc:2:0: Character.h:26:7: note: 'Character& Character::operator=(const Character&)' is implicitly deleted because the default definition would be ill-formed: class Character ^ Character.h:26:7: error: non-static const member 'const int Character::step', can't use default assignment operator In file included from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/stl_pair.h:59:0, from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/stl_algobase.h:64, from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/char_traits.h:39, from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/ios:40, from C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/ostream:38, from SFML\include/SFML/System/Err.hpp:32, from SFML\include/SFML/System.hpp:34, from SFML\include/SFML/Window.hpp:32, from SFML\include/SFML/Graphics.hpp:32, from Matrix_Map.h:4, from Game.cc:1: C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/move.h:177:11: error: use of deleted function 'Character& Character::operator=(const Character&)' __b = _GLIBCXX_MOVE(__tmp); ^ Makefile:58: recipe for target 'Game.o' failed mingw32-make: *** [Game.o] Error 1 C:\Users\MrC\Downloads\christoffer-4-master-6cf3aba574c6e82f917413d01922f578c3cd62d8>

Nu undrar jag om något geni kan förklara vad jag gör fel. Behöver ni bättre förklaring/kod är det bara att säga till, den då projektet är ganska stort kan inte all kod presenteras här.

Trädvy Permalänk
Medlem
Plats
Shangri-La
Registrerad
Maj 2010

Kort svar: Felet är det här:
C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/move.h:176:11: error: use of deleted function 'Character& Character::operator=(const Character&)'

Det du behöver checka är alltså att det finns en fungerande tilldelningsoperator för Character-klassen, som matchar mönstret (som returnerar en referens och tar en const-referens). Antagligen har du aldrig definierat detta i klassen, eller medlemmen tagits bort i run-time eller liknande

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Okt 2011
Skrivet av Oldskool:

Kort svar: Felet är det här:
C:/Program Files (x86)/CodeBlocks/MinGW/lib/gcc/mingw32/4.9.2/include/c++/bits/move.h:176:11: error: use of deleted function 'Character& Character::operator=(const Character&)'

Det du behöver checka är alltså att det finns en fungerande tilldelningsoperator för Character-klassen, som matchar mönstret (som returnerar en referens och tar en const-referens). Antagligen har du aldrig definierat detta i klassen, eller medlemmen tagits bort i run-time eller liknande

Tackar, överlagrade tilldelningsoperatorn och nu fungerar det.