g ++ не может разрешить перегрузку функции шаблона - PullRequest
6 голосов
/ 25 мая 2019

Со следующим кодом g ++ завершается ошибкой:

template <typename X = int, typename T, typename ...R>
    inline void func(const T&, R...) {}

template <typename T>
    struct S {};

template <typename X = int, typename T, typename ...R>
    inline void func(const S<T>&, R...) {}

int main() {
    func(42);
    func(S<int>()); // OK
    func(S<int>(), 1); // NOK
    func<int>(S<int>(), 1); // NOK
}

с:

<source>: In function 'int main()':
<source>:13:21: error: call of overloaded 'func(S<int>, int)' is ambiguous
     func(S<int>(), 1); // NOK
                     ^
<source>:13:21: note: candidates are:
<source>:2:17: note: void func(const T&, R ...) [with X = int; T = S<int>; R = {int}]
     inline void func(const T&, R...) {}
                 ^
<source>:8:17: note: void func(const S<T>&, R ...) [with X = int; T = int; R = {int}]
     inline void func(const S<T>&, R...) {}
                 ^
<source>:14:26: error: call of overloaded 'func(S<int>, int)' is ambiguous
     func<int>(S<int>(), 1); // NOK
                          ^
...

Воспроизводится с помощью gcc v4.8.1 и v9.1. Компилируется с помощью clang (v3.0.0 и v8.0.0), icc (v13.0.1 и v19.0.1), msvc (v19.14 и v19.20).
Код действителен или это ошибка в gcc?

РЕДАКТИРОВАТЬ: Спасибо всем, ваши отзывы были полезны для меня. К вашему сведению, ошибка 90642 была подана; с нетерпением жду определенного ответа.

1 Ответ

1 голос
/ 25 мая 2019

Интересный вопрос.Я думаю, что вы столкнетесь здесь с разрешением перегрузки , более конкретно правилами частичного упорядочения для специализации шаблона

Я цитирую:

Неофициально«A более специализирован, чем B» означает «A принимает меньше типов, чем B».

Я думаю, что для компиляции верен корректный лязг, и результат должен занять второго кандидата

template <typename X = int, typename T, typename ...R>
    inline void func(const S<T>& t, R... p) {}

Поскольку в случае, если первый аргумент не имеет типа S<T>, онбольше не жизнеспособен и поэтому более специализирован.

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