Size: a a a

2020 August 17

AT

Andrew Titov in pro.cxx
Потому что шаблон инстанцируется в обоих TU.
источник

AK

Andrei K in pro.cxx
Alex Sandrov
Добрый день
У меня такой вопрос. vector хорош для быстрых итераций по всей коллекции. unordered_map хорошо для быстрого доступа по ключу. А кто как совмещает эти два контейнера в чём-то одном, чтобы и доступ по ключу и быстрые итерации/доступ по индексу? 😐
Вектор + мапа из ключа в индекс в векторе.
источник

A

Alex in pro.cxx
Andrew Titov
Потому что шаблон инстанцируется в обоих TU.
И с этим никак нельзя бороться?
источник

AK

Andrei K in pro.cxx
Alex
Да, в этом и смысл forward declaration. А зачем в main.cpp определение деструктора А, если юник пойнтер разрушается деструктором В, а деструктор В в другом .срр файле и другом TU????
Потому что unique_ptr может держать указатель на делетер.
источник

S

Salt in pro.cxx
std::unique_ptr<A, std::function<void(A*)>
источник

AL

Anton Lashkov in pro.cxx
Нужно еще конструктор B поместить в .cpp
источник

A

Alex in pro.cxx
Я так понял, что это не поможет, но попробую
источник

A

Alex in pro.cxx
Anton Lashkov
Нужно еще конструктор B поместить в .cpp
Опа, кажется, помогло! А объяснить можете?)
источник

AT

Andrew Titov in pro.cxx
Alex
И с этим никак нельзя бороться?
Кажется, да.

main требует определение B, а B требует шаблон unique_ptr.
источник

AS

Anatoly Shirokov in pro.cxx
Alex
Опа, кажется, помогло! А объяснить можете?)
При дефолном коструировании B в конструкторе unique_ptr идет создание дефолтного делитора.
источник

A

Alex in pro.cxx
Andrew Titov
Кажется, да.

main требует определение B, а B требует шаблон unique_ptr.
Логично, но перенос конструктора в .срр помог, и я не понимаю, почему
источник

A

Alex in pro.cxx
deleter-то я не менял, остался просто unique_ptr<A>
источник

AT

Andrew Titov in pro.cxx
Alex
Логично, но перенос конструктора в .срр помог, и я не понимаю, почему
Честно говоря, я имел в виду "борьбу с инстанцированием".

Но прикол с конструктором я тоже не понял.
источник

AF

Aidar Fattakhov in pro.cxx
Alex
Воюю с unique_ptr и incomplete type. Система такая:
a.hpp:
struct A{};

b.hpp:
#include <memory>
struct A;
struct B {
  ~B();

  std::unique_ptr<A> a;
};

b.cpp:
#include "a.hpp"
B::~B() {}

main.cpp:
#include "b.hpp"
int main(){
  B b;
  return 0;
}

Получаю ошибку удаления incomplete type A в main.cpp. КАК??? Почему?
Должно работать
источник

A

Alex in pro.cxx
5 стадий осознания проблемы)
источник

AL

Anton Lashkov in pro.cxx
Дефолтный конструктор B компилятор добавляет в hpp, в нем вызывается конструктор unique_ptr, а в нем создается делетер. Тип неполный - ошибка.
источник

AS

Anatoly Shirokov in pro.cxx
Anatoly Shirokov
При дефолном коструировании B в конструкторе unique_ptr идет создание дефолтного делитора.
@WeekendDriver ты прочитал?
источник

AF

Aidar Fattakhov in pro.cxx
Alex
5 стадий осознания проблемы)
Да должно работать, это типичный пимпл из какой-то из книжек для новичков
источник

A

Alex in pro.cxx
Anatoly Shirokov
@WeekendDriver ты прочитал?
Прочитал, спасибо, но мне это ничего не объяснило
источник

AS

Anatoly Shirokov in pro.cxx
Alex
Прочитал, спасибо, но мне это ничего не объяснило
Дефолтный делетер не сможет удалить указатель на неполный тип.
источник