Здравствуйте, DTF, Вы писали:
DTF>Что я делаю не так и как правильно делать?
Я тебя сильно расстрою, если скажу, что частичной специализации шаблона функции в С++ нет? Помимо этого, тип результата функции не участвует в разрешении перегрузки. Поэтому следующий код просто не скомпилируется:
Компилятор пытается сопоставить специализацию с шаблоном и понимает, что подходящего ей шаблона нет.
В специализации указано foo<char>, т.е. предполагается что тип T == char.
Но в той же специализации на месте типа результата ожидается шаблоном тип T==char, а указан тип int.
Поэтому компилятор специализацию не принимает. DTF>(т.е. я хочу в определенных случаях возвращать другой тип, не тот, который обычно) DTF>Что я делаю не так и как правильно делать?
template<typename T, typename T2 = T> T2 foo();
#include <iostream>
template<typename T, typename T2 = T>
T2 foo() {
std::cout << " foo<T,T2>();" << std::endl;
T t = 0;
return t;
}
template<>
int foo<char>() {
std::cout << " foo<char,int>();" << std::endl;
int i = 0;
return i;
}
int main()
{
auto fC = foo<char>();
auto fCI = foo<char, int>();
return 0;
}
/*Output:
foo<T,T2>();
foo<char,int>();
*/
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Я тебя сильно расстрою, если скажу, что частичной специализации шаблона функции в С++ нет?
это конечно занимательный факт, однако не имеет отношение к вопросу, т.к. у ТС нет и не подразумеваются частичные специализации (у него есть полные специализации, которые работают и для шаблонных функций)
АШ>Помимо этого, тип результата функции не участвует в разрешении перегрузки.
и это не имеет отношение к вопросу, т.к. ТС спрашивает как сделать специализацию функции, а не как это вызвать
а делается она вот так: https://ideone.com/wAoErC (тут и вызовы показаны)
можно и так: https://ideone.com/73DVmt
проблема у ТС в том, что он попытался изменить сигнатуру функции так, что это встало в противоречие с объявленной шаблонной функцией : тип шаблона должен совпадать с типом результата функции (ошибка компиляции явно об этом говорит)
по поводу вариантов решения задачи "хочу в определенных случаях возвращать другой тип, не тот, который обычно", то тут их море, включая вариант отказа от специализаций функций как таковых, как и советуют умные люди типа Мейерса. способ можно подобрать оптимальнее, если понять исходную задачу лучше (нужны примеры что за функции, что возвращают и почему разного типа)
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Анатолий Широков, Вы писали:
АШ>>Я тебя сильно расстрою, если скажу, что частичной специализации шаблона функции в С++ нет? U>это конечно занимательный факт, однако не имеет отношение к вопросу, т.к. у ТС нет и не подразумеваются частичные специализации (у него есть полные специализации, которые работают и для шаблонных функций)
АШ>>Помимо этого, тип результата функции не участвует в разрешении перегрузки. U>и это не имеет отношение к вопросу, т.к. ТС спрашивает как сделать специализацию функции, а не как это вызвать U>а делается она вот так: https://ideone.com/wAoErC (тут и вызовы показаны) U>можно и так: https://ideone.com/73DVmt U>проблема у ТС в том, что он попытался изменить сигнатуру функции так, что это встало в противоречие с объявленной шаблонной функцией : тип шаблона должен совпадать с типом результата функции (ошибка компиляции явно об этом говорит)
Здравствуйте, DTF, Вы писали:
DTF>(т.е. я хочу в определенных случаях возвращать другой тип, не тот, который обычно) DTF>Что я делаю не так и как правильно делать?
Специализация шаблонной функции должна в точности соответствовать объявлению основного шаблона. Обойти это ограничение можно, реализовав шаблонную функцию через шаблон класса с необходимыми специализациями: