Эта версия работает нормально:
template<typename T>
struct Foo
{
template<typename U = T>
typename std::enable_if<std::is_same<U,A>::value>::type
bar() { std::cout << "1" << std::endl; }
template<typename U = T>
typename std::enable_if<std::is_same<U,B>::value>::type
bar() { std::cout << "2" << std::endl; }
};
Эта версия не работает:
template<typename T>
struct Foo2
{
template<typename U = T, typename V = typename std::enable_if<std::is_same<U,A>::value>::type >
V bar() { std::cout << "1" << std::endl; }
template<typename U = T, typename V = typename std::enable_if<std::is_same<U,B>::value>::type >
V bar() { std::cout << "2" << std::endl; }
};
с:
ошибка: 'шаблон шаблона V Foo2 ::bar () 'не может быть перегружен' шаблоном шаблона V Foo2 :: bar () '
Разница между обеими версиями в том, что в первой я использую выражение напрямую, во второй я создаюПараметр шаблона по умолчанию и используйте его в качестве возвращаемого типа.
В чем причина сбоя во втором примере?