Неоднозначный запрос в gcc - не двусмысленный в clang [duplicate]

Как сделать клик по тегу, щелкнуть по кнопке файла?

Для этого есть дополнительная поддержка браузера, но я использую ES6, поэтому, если вы действительно хотите, чтобы он работал более старыми и любой браузер, попытайтесь перевести его с помощью babel или просто используйте ES5:

const aTag = document.getElementById("open-file-uploader");
const fileInput = document.getElementById("input-button");
aTag.addEventListener("click", () => fileInput.click());
#input-button {
  position: abosulte;
  width: 1px;
  height: 1px;
  clip: rect(1px 1px 1px 1px);
  clip: rect(1px, 1px, 1px, 1px);
}
<a href="#" id="open-file-uploader">Open file uploader</a>
<input type="file" id="input-button" />

26
задан Barry 15 April 2015 в 22:16
поделиться

2 ответа

Похож на ошибку Clang для меня.

Общее правило состоит в том, что функции-члены одного и того же имени в разных базовых классах не перегружаются. Например:

struct Foo { void bar(); };
struct Baz { void bar(int); };
struct Quux : Foo, Baz { };

int main() { Quux().bar(); } // error on both GCC and Clang

По какой-то причине Clang не может диагностировать эту двусмысленность для operator().

A using-declaration поднимает именованные базовые классы в область производного класса , что позволяет им перегружать. Следовательно:

struct Quux_2 : Foo, Baz { using Foo::bar; using Baz::bar; };
Quux_2().bar(); // OK.

В рабочей версии кода декларации using рекурсивно привносят каждое объявление operator() в аргументы шаблона в область самого производного класса, что позволяет им перегружать.

16
ответ дан T.C. 15 August 2018 в 17:56
поделиться
  • 1
    Это связано с тем, что поиск имени выполняется до начала разрешения перегрузки, а поиск по имени находит как Foo::bar, так и Baz::bar, из которых ни один из них не является предпочтительным? – M.M 9 September 2015 в 21:07

Исходный код не должен компилироваться, gcc здесь верен. См. [Class.member.lookup]:

В противном случае (т. Е. C не содержит декларации f или результирующий набор объявлений пуст), S (f, C) изначально пуст. Если C имеет базовые классы, вычислите набор поиска для f в каждом подбодете прямого базового класса Bi и объедините каждое такое поисковое множество S (f, Bi) в свою очередь в S (f, C). - [..] - В противном случае, если множества объявлений S (f, Bi) и S (f, C) различаются, слияние неоднозначно ...

Начальный набор объявлений (overload не имеет методов) - так объедините все базы, все из которых имеют разные наборы. Таким образом, слияние должно потерпеть неудачу. Это правило применяется только в том случае, если набор объявлений overload пуст, поэтому явное добавление using F1::operator() работает.

10
ответ дан Barry 15 August 2018 в 17:56
поделиться