Почему не удается разрешить вывод / перегрузку этого аргумента шаблона? - PullRequest
0 голосов
/ 20 февраля 2019

Этот фрагмент кода не компилируется в MSVC , Clang и Gcc , (они выдают другое сообщение об ошибке):

int foo(int a, int b) {
    return a + b;
}

template <class Ret, class A, class B>
void foo(Ret (*)(A, B)) {

}

int main() {
    foo(foo);
    return 0;
}

Разве это не должно компилироваться?Я не могу понять, почему не удается разрешить перегруженную функцию или определить аргументы шаблона.Любая помощь приветствуется, спасибо.

PS: Он компилируется, если шаблон заменен на void foo(int (*)(int, int)), или если мы переименуем один из foo, чтобы избежать перегрузки.

1 Ответ

0 голосов
/ 20 февраля 2019

Для простоты давайте назовем первую перегрузку foo1 и назовем вторую перегрузку foo2.

С шаблонами проблема в том, что вы не можете вывести аргументы шаблона для внешнего foo, в соответствии сto [temp.deduct.call] / 6 :

Если аргумент является набором перегрузки, содержащим один или несколько шаблонов функций, параметр обрабатывается как невыгруженный контекст.

Без шаблонов программа рассматривает все возможности foo1(foo1), foo1(foo2), foo2(foo1), foo2(foo2) и выбирает единственную жизнеспособную foo2(foo1), в соответствии с [более.over] / 6 :

[ Примечание: Если f() и g() - обе перегруженные функции, необходимо рассмотреть перекрестное произведение возможностей для разрешенияf(&g) или эквивалентное выражение f(g).- Конечная нота ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...