Соответствие явно созданного шаблона функции преобразованию - PullRequest
4 голосов
/ 01 февраля 2020

Рассмотрим этот шаблон с неявным конструктором

template<typename T>
struct X { X(T) { } };

и этот шаблон функции

template<typename T>
void func(X<T>) { }

Даже если я сделаю явное создание экземпляра func<T>() для T = int

template void func<int>(X<int>);

Такой вызов func не компилируется

func(1);

Ошибка:

нет соответствующего вызова функции для 'fun c'

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

Почему не работает?

1 Ответ

4 голосов
/ 01 февраля 2020

Проблема дана func(1);, вычет аргумента шаблона не удается вывести T (как int).

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

, но

Вывод типа не учитывает неявные преобразования (кроме корректировок типа, перечисленных выше): это работа для разрешения перегрузки, которая происходит позже.

Явная реализация ничего не меняет; Вывод аргумента шаблона не может вывести T, тогда не будет выполнено создание экземпляра (func<int> или что-то еще).

Вы можете явно указать аргумент шаблона, чтобы обойти вывод аргумента шаблона.

func<int>(1);

Вы можете написать обертку для нее как

template<typename T>
void bar(T t) {
    func<T>(t);
}

, тогда вы можете

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