LINUX.ORG.RU

clang: member overload ambiguous

 ,


0

2

Имеется класс вида


struct A
{
 void f(const String&);
 String f(const int) const;
};


...
A* a = new A;
a->f(1); // clang9: error ambiguous overload

«Чинится» так static_cast<const A*>(a)->f(1);

В отдельно взятом примере - не воспроизводится.

В чем может быть проблема, идеи? Что тут шлангу не понятно? Разве что String не определен и компилятор думает что неопределенный тип - int.

★★★★★

Последнее исправление: invy (всего исправлений: 1)

Например так:

struct String {
    String(int);
};

struct A
{
 void f(const String&);
 String f(const int) const;
};

int main() {
    A* a = new A;
    a->f(1);
}
anonymous
()

В отдельно взятом примере - не воспроизводится.

Когда воспроизведётся, тогда и приходи.

anonymous
()

Разве что String не определен и компилятор думает что неопределенный тип - int.

Каким образом String может оказаться int-ом?

anonymous
()
Ответ на: комментарий от stasolog

Там String это не int, а только может из него получаться.

anonymous
()
Ответ на: комментарий от anonymous

Там 2 преобразования аргументов. Первое — это байндинг implicit object parametr-а, и он лучше для первой перегрузки.

anonymous
()

Разве что String не определен

Там объявление без определения, или что? Ты бы показал String.

Может, принимается int, а передается например long long.

anonymous
()

Скорее всего следствие предыдущей ошибки(тот же String не определён или ещё что)

DllMain
()
Ответ на: комментарий от anonymous

100% правильный ответ, спасибо анон. У String был c’tor String (char) и блджад implicit cast int -> char и следовательно амбигоус оверлоад.

invy ★★★★★
() автор топика
Ответ на: комментарий от invy

У String был c’tor String (char)

Когда-то давно я тоже такой конструктор писал.

anonymous
()
Ответ на: комментарий от invy

Наверняка это написано в предупреждении шланга.

anonymous
()
Ответ на: комментарий от anonymous

После выяаления ошибки уже ясно как чинить :)

Там много халтуры написано.

Если быть точным, то этот String наслелует от ATL:: CString, и у ATL::CString эти же конструкторы explicit. И вот когда «нормальным» компилятором это легаси начал собирать, все полезло.

invy ★★★★★
() автор топика
Последнее исправление: invy (всего исправлений: 2)
Ответ на: комментарий от anonymous

int -> int и int -> char -> String не равносильны, int -> int лучше.

Дико — это читать такие комменты про равносильность, когда как в тредю было уже объяснено, откуда возникает неоднозначность.

anonymous
()
Ответ на: комментарий от invy

Если ты считаешь, что int -> int и int -> char -> String равносильны, тебе не стоит на плюсах писать. Посмотри в сторону PHP или VBA.

anonymous
()
Ответ на: комментарий от invy

gcc проглатывает с предупреждением, что это ошибка по iso c++, и выбрал лучший вариант A::f(int)

anonymous
()
Ответ на: комментарий от anonymous

Да пофигу откуда она возникает. Дико что она возникает, и дико что крестанутые не считают это диким.

anonymous
()
Ответ на: комментарий от anonymous

Да пофигу откуда она возникает. Дико что она возникает

Вижуалвасики, Жабаскриптеры и похапешники негодуют!!!1!111

как-то так if (length(isTrue) == 5) print "false"

anonymous
()
Ответ на: комментарий от anonymous

Дико что она возникает, и дико что крестанутые не считают это диким.

Отправь дефект-репорт, его даже примут, скорее всего. Если не забудут про твоё письмо.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.