2013-12-05 2 views
13

Я смущен приведенным ниже шаблоном, где он компилируется с помощью пустых угловых скобок (шаблон без параметров), так как синтаксически шаблон <> зарезервирован для обозначения явной специализации шаблона.вызов функции шаблона с пустыми угловыми скобками <>

template <typename T> void add(T a, T b) { } 
int main() { 
    add<>(10, 3); // compiles fine since both parameters are of same data type 
    add<>(10, 3.2); // Error: no matching function for call to add(int, double) 
} 

В приведенном выше случае параметр шаблона действительно необязательный?

ответ

5

В первом случае да, потому что это можно сделать по правилам стандарта. Во втором нет, потому что они не могут - вы должны написать что-то вроде:

add<float>(10, 3.2); 
3

У вас есть один параметр шаблона и два функциональных параметров различных типов. Вывод аргумента шаблона должен совпадать для обоих аргументов, но если вы укажете int и double, это не сработает. Причина в том, что выведенный аргумент должен иметь точное соответствие и преобразования типов не учитываются.

Синтаксис

add<double>(10, 3.2); 

бы явно заставить T равным double. В этом случае константа int10 преобразуется в double.

Вы также могли бы добавить еще один от перегрузки

template <typename T, typename U> void add(T a, U b) { } 

и, возможно, ограничить, что использование SFINAE, требуя, чтобы is_convertible<T, U>

11

template<> зарезервирован для обозначения явной специализации шаблона.

Это означает различные вещи, в зависимости от контекста. Здесь это означает «использовать аргумент по умолчанию или выведенный», как если бы вы просто сказали add.

В первом случае оба аргумента функции имеют один и тот же тип, поэтому аргумент шаблона можно вывести как int.

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

В приведенном выше случае параметр шаблона действительно необязательный?

Да, если это можно вывести из типов аргументов.