Есть ли общие руководящие принципы для решения неопределенного, ссылаются/не разрешают на проблемы символа?

Распределитель по умолчанию, используемый для std::multimap, является

std::allocator<std::pair<const Key, T>

. Таким образом, ключи в std::multimap являются const, что делает тип как

std::pair<const std::string, std::string>

, где как [117 ] ожидает параметр как ссылку на тип

std::pair<std::string, std::string>

Изменить ask() на

void ask(std::pair<const std::string, std::string>& entry)
{
}
6
задан Cœur 14 October 2018 в 14:53
поделиться

2 ответа

ЕСЛИ ВЫ ИСПОЛЬЗОВАЛИ MSVC:

Вы не можете уклониться от этого типа ошибки путем установки флага: это означает, что некоторые единицы (.cpp)' не имеют определений заявленных идентификаторов. Это, конечно, вызывается пропавшими без вести, включает или пропускающий определения объектов (часто статические объекты) где-нибудь.

В то время как разработка Вас может следовать тем инструкциям (от тех статей), чтобы быть уверенной, что весь Ваш cpp включает все заголовки, в которых они нуждаются, но не больше:

  • Каждый cpp файл включает свой собственный заголовочный файл сначала. Это - самая важная инструкция; все остальное следует отсюда. Единственным исключением к этому правилу является предварительно скомпилированный заголовок, включает в Visual Studio; это всегда должно быть первым, включают в файл. Больше о предварительно скомпилированных заголовках в части второй этой статьи.
  • Заголовочный файл должен включать все заголовочные файлы, необходимые для парсинга его. Это идет рука об руку с первой инструкцией. Я знаю, что некоторые люди пытаются никогда не включать заголовочные файлы в заголовочных файлах, требуя эффективности или чего-то вдоль тех строк. Однако, если файл должен быть включен, прежде чем заголовочный файл может быть проанализирован, он должен быть включен где-нибудь. Преимущество включения его непосредственно в заголовочном файле состоит в том, что мы можем всегда решать вытянуть в заголовочном файле, которым мы интересуемся, и нам гарантируют это, это будет работать, как. Мы не должны играть “предположение, что другие заголовки Вам нужна” игра.
  • Заголовочный файл должен иметь количество абсолютного минимума заголовочных файлов, необходимых для парсинга его. В предыдущем правиле было сказано, что у Вас должно быть все включение, Вам нужно в заголовочном файле. В этом правиле говорится, что Вы не должны больше иметь, чем Вы имеете к. Очевидно, запустите путем удаления (или не добавляя во-первых) бесполезный включают операторы. Затем используйте столько предописаний, сколько Вы можете вместо включать. Если все, что Вы имеете, является ссылками или указателями на класс, Вы не должны включать заголовочный файл того класса; ссылка вперед сделает приятно и намного более эффективно.

Но как комментатор предложили, кажется использованием g ++...

6
ответ дан 9 December 2019 в 22:41
поделиться

Установка системы сборки, где X зависит от Y, который зависит от Z, помогает. Это - при вхождении в круги (Z, зависит от X), что вещи становятся ужасными.

Часто это - библиотеки порядка, связаны ("-lZ-lY-lX" по сравнению с "-lX-lY-lZ"), который вызывает горе. Более редко у Вас есть то же имя библиотеки в нескольких местах на Вашем пути поиска или Вашем соединении против устаревших версий, которые еще не были перекомпилированы.

"nm - demangle" может позволить Вам видеть, где вещи определяются/используются.

"ldd" может использоваться для наблюдения, от каких динамических библиотек Вы зависите.

gcc/g ++ отмечают-print-file-name=LIBRARY, может помочь отнести дорожку точно, какой библиотекой пользуются.


Запоздалая мысль: (Так как Вы спрашиваете о правилах/инструкциях.)

Возможно настроить систему make-файла, таким образом что:

  • Если module=D зависит от модулей A, B, &C.
  • Затем попытка сделать module=D сначала сделала бы модули A, B, &C.
  • И что еще более важно, module=D автоматически определил бы свои библиотеки (-lA, и т.д.), пути к библиотеке (-LA), и включал бы пути (-IA) от make-файлов для модулей A, B, &C.

Это может стать немного волосатым для установки. В прошлый раз, когда я сделал это, я одобрил просто кэширование информации вместо того, чтобы разветвиться, чрезмерное количество делают подпроцессы. Вместе с импортом make-файла и небольшим сценарием жемчуга для удаления дубликатов. Kludgey, я знаю. (Власть имущие не хотели проводить время на инфраструктуре.), Но это может быть сделано.

С другой стороны я использовал GNU - делают, который имеет несколько расширений.

5
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: