Невозможно вывести параметр шаблона из зависимой области

Я хочу вызвать функцию шаблона с выведенным вторым параметром шаблона. Функция шаблона опирается на два типа шаблона и принимает их аргумент и типы возвращаемых значений из зависимой области. Рассмотрим следующий пример:

struct A
{
    struct S
    {
        int a;
        int b;
    };
    int c;
};

struct B
{
    struct S
    {
        int a;
        int b;
    };
    int c;
};

template <typename T, typename U>
typename T::S foo(const typename U::S& us)
{
    typename T::S ts;
    if (us.a > 0)
        ts.a = 1;
    else
        ts.a = 0;
    return ts;
}

int main()
{
    B::S bs;
    bs.a = 0;
    auto as = foo<A,B>(bs); // works
    auto as = foo<A>(bs); // couldn't deduce template parameter 'U'
    std::cout << as.a;
}

Я получаю следующую задачу дедукции:

prog.cc:27:15: note: candidate: 'template<class T, class U> typename T::S foo(const typename U::S&)'
   27 | typename T::S foo(const typename U::S& us)
      |               ^~~
prog.cc:27:15: note:   template argument deduction/substitution failed:
prog.cc:42:24: note:   couldn't deduce template parameter 'U'
   42 |     auto as = foo<A>(bs);
      | 

0 ответов

Другие вопросы по тегам