Проблема в том, что аргументы шаблона по умолчанию не являются частью сигнатуры шаблона функции .Два SomeFunction
считаются идентичными, а затем вызывают ошибку объявления.
Два функциональных шаблона считаются эквивалентными, если
- они объявлены в одной и той же области действия
- они имеют одинаковые имена
- они имеют идентичные списки параметров шаблона
- выражения, включающие параметры шаблона в их возвращаемых типах и списках параметров, эквивалентны
Вы можете использовать их в возвращаемых типах, например (для C ++ 11)
template <typename T_ = T>
typename std::enable_if<!std::is_pointer<T_>::value>::type SomeFunction()
{
// Do nothing
}
template <typename T_ = T>
typename std::enable_if<std::is_pointer<T_>::value>::type SomeFunction()
{
// Do sth
}
LIVE
Или использовать их в нетиповом параметре шаблонасписок, например (для C ++ 11)
template < typename T_ = T, typename std::enable_if<!std::is_pointer<T_>::value>::type* = nullptr>
void SomeFunction()
{
// Do nothing
std::cout << "Do nothing\n";
}
template < typename T_ = T, typename std::enable_if<std::is_pointer<T_>::value>::type* = nullptr>
void SomeFunction()
{
// Do sth
std::cout << "Do sth\n";
}
LIVE