Перегрузка функции с одинаковыми условиями - PullRequest
0 голосов
/ 03 мая 2020

Следующий код ( онлайн )

template<int m> struct A {
    void f(A<m> const& that) const requires m > 1 { }
    void f(A<1> const& that) const requires m > 1 { }
};

int main(){
    A<2> a;
    a.f(a);
    return 1;
}

выдает ошибку void A<m>::f(const A<1>&) const requires m > 1int m = 1] невозможно перегрузить с помощью void A<m>::f(const A<m>&) const requires m > 1int m = 1] .

Почему это не разрешено?

1 Ответ

2 голосов
/ 03 мая 2020

Ключ здесь "[with int m = 1]". Когда m равно 1, вы получаете эти две «перегрузки»

void f(A<1> const& that) const requires 1 > 1 { }
void f(A<1> const& that) const requires 1 > 1 { }

Предложение «неудовлетворенные требования» не «объявляет» перегрузку. Это только делает перегрузку не участвующей в разрешении перегрузки. Перегрузка все еще объявляется, и в вашем случае вы получаете дважды одно и то же определение для m = 1.

. Простой обходной путь - сделать подписи разными, получая при этом две перегрузки

void f(A<m> const& that) const requires m > 1 { }
void f(A<1> const& that, int = 0) const requires m > 1 { }
...