я следующий код демонстрации:запрещайте автоматический вывод типа
template <int i, typename T, typename U>
T func(const U &t){return i * t;}
template <int i, typename T>
T func(const T &t){return 2 * i * t;}
int main()
{
return func<1, int>(1);
}
Который является сводились версия моего реального кода, так что кажется бесполезным, но должно быть достаточно, чтобы показать проблему:
In function ‘int main()’:
11:23: error: call of overloaded ‘func(int)’ is ambiguous
11:23: note: candidates are:
2:3: note: T func(const U&) [with int i = 1, T = int, U = int]
5:3: note: T func(const T&) [with int i = 1, T = int]
Таким образом, очевидно, что автоматический вывод типа (для параметра шаблона U) мешает моим интересам выбора правильной версии функции шаблона (которая имеет только 2 параметра)
Мне нужны обе версии, чтобы иметь базовый и специализированный шаблон, которые немного отличаются друг от друга.
Итак, вопрос в том, есть ли возможность сообщить компилятору, чтобы он не выводил тип автоматически в этот момент (например, как-то говоря: возьмите шаблон, который имеет только 2 параметра)?
Вы имеете в виду, кроме очевидного? (чтобы дать им возможность использовать шаблоны для разных имен - какой смысл иметь одно и то же имя, если вам нужно что-то сделать самому, чтобы проинструктировать компилятор, на котором можно использовать?) – Mat
Ну, это был бы последний выбор, но я бы хотел функции для совместного использования одного и того же имени. – Nobody
Я бы также предложил редизайн путем переименования. Для меня это кажется очень плохим запахом кода. Люди уже легко запутываются вопросом о том, какая функция перегруженного набора используется. Если что-то подобное присутствует, это делает его еще сложнее и может привести к недостижимому коду позже. – LiKao