В чем главное отличие создания ссылки от создания объекта? - PullRequest
0 голосов
/ 26 апреля 2011

Итак, некоторое время назад я играл с примером Boost.Extension. Они использовали

  std::map<std::string, factory<computer> > computers;
  computers.swap(types.get());

Но когда я начал портировать проект с bjam на premake на Visual Studio Project 2008 Я обнаружил, что не могу использовать метод, который они использовали длясоздание карты.Я всегда получаю Ошибка компилятора C2512 в этой строке (на самом деле строка 74 внутри Boost.Extension type_map.hpp ).Итак, Я использовал способ создания ссылки на карту :

map<string, factory<computer> >& computers(types.get());

(они использовались в некоторых из этих учебных пособий ), и все это скомпилировано.Я довольно новичок в C ++ и, вероятно, много не понимаю.

Так в чем же отличие создания карты по ссылке от простого создания карты, в данном случае и в целом?

Обновление - полное сообщение об ошибке

Ошибка 1 ошибка C2512: boost :: extensions :: basic_type_map :: type_map_convertible :: type_holder: нет подходящего конструктора по умолчанию, доступного c: \ users \ avesta \ downloads \ extension-svn-source \ boost \ extension \ type_map.hpp 74 Mltiple-Inheritance

1 Ответ

3 голосов
/ 26 апреля 2011

Разница в том, что во втором случае карта вообще не создается;он создает ссылку на карту, которая уже существует.types содержит карту, а types.get() возвращает ссылку на эту карту, которую вы используете для инициализации своей собственной ссылки.Если вы модифицируете карту, используя эту ссылку, то вы модифицируете карту, содержащуюся в types.

В первом случае создается пустая карта;затем он заменяет ее (предположительно, не пустой) картой, содержащейся в types, оставляя types пустым впоследствии.Это потребует большей поддержки от различных участвующих классов;некоторые могут нуждаться в создании по умолчанию, замене и, возможно, копировании и / или назначении.Кажется, код ошибки указывает, что одному из классов нужен общедоступный конструктор по умолчанию, но его нет;это может помочь диагностировать проблему, если включить полное сообщение об ошибке.

...