Поиск сложный. Проблема, о которой говорили другие, - это зависящий от аргумента поиск или ADL. Правила ADL были добавлены, чтобы дать возможность определениям операторов в том же пространстве имен, что и типы, на которые они ссылаются, и включить поиск, чтобы найти эти операторы, когда они есть. Это было позже распространено на все другие функции в процессе стандартизации.
Проблема заключается в том, что tie(...)
является вызовом функции. Компилятор попытается выполнить регулярный поиск из точки использования (внутри main
) он перейдет в пространство имен. Директива using добавит ::std
в поиск поиска, когда он попадает в корневое пространство имен (общий предок ::std
и ::main
). В этот момент, так как идентификатор решает функцию, ADL будет удар в.
ADL добавляет пространство имен связанные к аргументам вызова функции, которая в данном случае является boost::
(основные типов, как int
не имеет ассоциированный Пространства имен). На этом этапе компилятор видит два объявления tie
: std::tie
и boost::tie
, вызывая неоднозначность.
Как вы уже знаете, решение состоит в том, чтобы квалифицировать вызов на std::tie
(что я бы посоветовал вам использовать даже без этой проблемы). Что касается комментария:
Если ADL позволяет решить увеличить :: галстук ... «моего удобства», а затем компиляция завершится неудачно, не следует, что быть ключом к компилятору, что он выбрал неправильную функцию ?!
Я не знаю, что точная ошибка вы получаете (я не использую импульс, и я не знаю, что это возможно перегрузки std::tie
содержит). Если проблема действительно является одной из двусмысленностей, проблема в том, что компилятор не может разрешить идентификатор и не может продолжить процесс. В этот момент он останавливается и просит программиста его решить. Если ошибка заключается в том, что она уникально выбрана boost::tie
, и позже она не удалась в присваивании, это означает, что theres является перегрузкой boost::tie
, которая лучше соответствует std::tie
, и это было выбрано. Позднее назначение с std::tuple
может быть неудачным, но компилятор не может знать, была ли проблема во время поиска, или это само присваивание (вы намеревались назначить эту переменную? Может быть, другой?), Так что снова это не удается и рассказывает вам, в чем проблема.
Обратите внимание, что в целом процесс компиляции всегда движется вперед , компилятор не отступиться удвоится угадать свои собственные решения *. Существует набор правил, и эти правила применяются на каждом шаге.Если есть двусмысленность, компиляция останавливается, если нет, то есть единственный кандидат, и этот момент разрешен, переходя к следующему. Попытка вернуться к отмене решений превратит процесс компиляции во что-то болезненно медленное (количество путей, которые можно было бы сделать, было бы экспоненциальным).
* Как всегда есть исключения, но это лишь исключения, в частности, в процессе разрешения перегрузки, если шаблон выбран в качестве лучшего кандидата, но замещение аргументов типа оканчиваются неудачей, то отбрасывается и выбирается следующий лучший кандидат.
Это ADL. Используйте квалифицированное имя для обоих. – chris
"после того, как я вызываю' using namespace std' "- *** NO *** – Xeo
@Xeo: Я не в файле заголовка. I.e., IRL, определения fcn находятся в файлах заголовков без 'use', поэтому я помещаю его в' main() 'здесь. Кроме того, это не правило. –