Похож на ошибку 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()
в аргументы шаблона в область самого производного класса, что позволяет им перегружать.