В чем основное различие между созданием ссылки и созданием объекта?

#c #object #map #reference #boost-extension

#c #объект #словарь #ссылка #boost-расширение

Вопрос:

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

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

Но когда я начал перенос проекта с bjam на premake в visual studio project 2008, я обнаружил, что не могу использовать метод, который они использовали для создания map. Я всегда получал ошибку компилятора C2512 в этой строке (на самом деле в строке 74 внутри Boost.Расширение type_map.hpp). Итак, я использовал способ создания ссылки на карту:

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

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

Итак, в чем разница между созданием карты по ссылке и простым созданием карты, в данном случае и вообще?

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

Ошибка 1 ошибка C2512: boost:: extensions::basic_type_map::type_map_convertible::type_holder: не доступен подходящий конструктор по умолчанию c:usersavestadownloadsextension-svn-sourceboostextensiontype_map.hpp 74 Млтипа-Наследование

Комментарии:

1. Сообщает ли вам сообщение об ошибке, в каком классе отсутствует конструктор по умолчанию?

Ответ №1:

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

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