Неоднозначный вызов перегрузки к брюшному прессу (дважды)

В моем случае проблема оказалась псевдонимом, которое я дал таблице. «oa», по-видимому, неприемлемо для SQL Server.

56
задан 3 September 2009 в 15:21
поделиться

2 ответа

В моих случаях я решил проблему при использовании labs() вместо abs().

0
ответ дан 26 November 2019 в 17:22
поделиться

Заголовок представляет собой заголовок библиотеки C std. Он определяет множество вещей в глобальном пространстве имен. Заголовок - это версия этого заголовка для C ++. По сути, он определяет то же самое в пространстве имен std . (Есть некоторые отличия, например, версия C ++ поставляется с перегрузками некоторых функций, но это не имеет значения.) Заголовок не существует.

Поскольку производители не хотят поддерживать две версии того, что по сути является одним и тем же заголовком, они придумали разные возможности иметь только одну из них за кулисами. Часто это заголовок C (поскольку компилятор C ++ может его проанализировать, а обратное не сработает), а заголовок C ++ просто включает это и помещает все в пространство имен std . Или есть некоторая магия макросов для синтаксического анализа одного и того же заголовка с пространством имен std или без него или без него. К этому добавьте, что в некоторых средах неудобно, если заголовки не имеют расширения файла (например, редакторы не могут выделить код и т. Д.). Таким образом, у некоторых поставщиков будет однострочным, включая некоторые другие заголовки с расширением .h . Или кто-то может сопоставить все включает соответствие с (которое, с помощью макромагии, становится заголовком C ++, когда определено __ cplusplus , и иначе становится заголовком C) или или что-то еще.

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

Я понятия не имею, какую реализацию std lib вы используете. Я полагаю, что это тот, который поставляется с GCC, но этого я не знаю, поэтому я не могу точно объяснить, что произошло в вашем случае. Но это, безусловно, смесь одного из вышеупомянутых хаков, связанных с конкретным поставщиком, и вы включаете заголовок, который вам не следовало включать. Может быть, это тот, где сопоставляется с с определенным (набором) макросов, которые вы не определили, так что вы закончили с обоими определениями.

Обратите внимание, однако, что этот код по-прежнему не должен компилироваться:

#include <cmath>

double f(double d)
{
  return abs(d);
}

Не должно быть t быть abs () в глобальном пространстве имен (это std :: abs () ). Однако, согласно описанным выше уловкам реализации, вполне может быть. Перенос такого кода позже (или просто попытка скомпилировать его со следующей версией вашего поставщика, которая не позволяет этого) может быть очень утомительным, поэтому вам следует следить за этим.

48
ответ дан 26 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

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