emplace_back i typ niekopiowalny

0

Witajcie,

mam taką klasę

struct SomeType;

template < class T > class List
{
    private:
        (...)
    public:
        List()
        {
            init();
        }
        List(T * head)
        {
            init(head);
        }
        List(const List& list) = delete;
        List& operator= (const List& list) = delete;
        ~List()
        {
            reset();
        }
}

Dalej, w kodzie mam definicję:

std::vector<List<SomeType>> container;

Teraz problem z którym się zmagam - czy jest dodawania do takiej struktury zmiennych w sposób "push_back" lub "emplace_back"?
Próbowałem czegoś takiego, ale dalej są błędy, że kompilator chce wołać konstruktor kopiujący, a ten typ nie może być kopiowany.

container.emplace_back({});

Dzięki z góry!

0

Podaj więcej kodu.
emplaceXXX oznacza tworzenie obiektu bezpośrednio w kontenerze, więc nie ma kopiowania! Coś robisz źle.
Poza tym, najwyraźniej męczysz się z move semantics

0
MarekR22 napisał(a):

Podaj więcej kodu.

emplaceXXX oznacza tworzenie obiektu bezpośrednio w kontenerze, więc nie ma kopiowania! Coś robisz źle.
Poza tym, najwyraźniej męczysz się z move semantics

Tak, *push_back *używa kopiowania, dlatego wybrałem emplace_back.
Próbowałem takich wywołań tej drugiej metody:

container.emplace_back({});
container.emplace_back();

Żadne z nich nie działa. Skoro chcemy wywołać konstruktor bezargumentowy typu List, to nie powinniśmy podawać już żadnych obiektów do emplace_back. Gdzieś robię błąd w rozumowaniu?

Generalnie problem można streścić w pytaniu - jak dodać nowy element do powyższego kontenera?

3

vector wymaga aby dało się zrobić copy lub move. Jawnie zadeklarowałeś operacje kopiujące (jako deleted), więc nie będzie niejawnie zdefiniowanych wersji move.

Dodaj poniższe i po sprawie:

        List(List&& list) = default;
        List& operator= (List&& list) = default;

https://wandbox.org/permlink/eARQhWKz0DiOG9Us

1 użytkowników online, w tym zalogowanych: 0, gości: 1