почему sfinae перегрузка не решена - PullRequest
0 голосов
/ 06 июня 2018

Эта версия работает нормально:

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 () '

Разница между обеими версиями в том, что в первой я использую выражение напрямую, во второй я создаюПараметр шаблона по умолчанию и используйте его в качестве возвращаемого типа.

В чем причина сбоя во втором примере?

1 Ответ

0 голосов
/ 06 июня 2018

Поскольку в случае № 2 два bar считаются эквивалентными.Когда учитывает, эквивалентны ли два шаблона функции , параметры шаблона по умолчанию игнорируются;они не являются частью сигнатуры шаблона функции.Таким образом, они рассматриваются как

template<typename U, typename V>
V bar() { std::cout << "1" << std::endl; }

template<typename U, typename V>
V bar() { std::cout << "2" << std::endl; }

Как вы можете видеть, они на самом деле эквивалентны.

(выделение мое)

Два шаблона функцийсчитается эквивалентным, если

  • они объявлены в одной и той же области действия
  • они имеют одинаковое имя
  • они имеют идентичные списки параметров шаблона
  • выражения, включающие параметры шаблона в их возвращаемых типах и списках параметров, эквивалентны

Случай № 1 работает, поскольку тип возвращаемого значения зависит от параметра шаблона и используется с другим выражением;тогда они считаются не эквивалентными.

...