Ошибка разбора шаблона C ++ 11, вывод типа с использованием псевдонима шаблона - PullRequest
0 голосов
/ 03 мая 2018

У меня немного тупой вопрос, ошибки синтаксического анализа шаблонов так часто встречаются при переполнении стека, но я не нашел ничего похожего на мою проблему. Я позволю кому-то еще доказать, что я не прав, пока сосредоточусь на этом вопросе.

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

#include <functional>
#include <iostream>

enum selector
{
    SEL1,
    SEL2,
};

У меня есть классы черт, которые я использую для хранения некоторой «полезной», повторяющейся и статической информации, которую я пытаюсь передать в алгоритм под названием f далее.

template <selector T>
class custom_traits;

template<>
class custom_traits<SEL1>
{
    public:
        template <typename T>
        using OPERATOR = std::less<T>;
};

template<>
class custom_traits<SEL1>
{
    public:
        template <typename T>
        using OPERATOR = std::greater<T>;
};

Я создал вспомогательную функцию, которая поможет выполнить некоторую операцию, уникальную для каждого класса черт. Я скопировал и изменил эту функцию f() из cppreference, поскольку это то, что я использовал в качестве ссылки.

template <typename U, typename A, typename B>
bool f(A a, B b, U op = U()) 
{
    return op(a, b);
}

Здесь, в моей основной функции, давайте назовем ее g(), где происходит ошибка синтаксического анализа шаблона, когда я выполняю вызов f< TT::typename OPERATOR<OT> >(a,b)

template<  selector T, typename OT, typename TT = custom_traits<T> >
bool g( const OT a, const OT b)
{
    return f< TT::typename OPERATOR<OT> >(a,b);
}

int main() 
{
    g<SEL1>(1,3);

    return 0;
}

Интересно, что он прекрасно скомпилируется, если я заменю

f<TT::typename OPERATOR<OT>> 

с

f<std::less<int>> 

или даже

f<std::less<OT>>

непосредственно. Так что подтверждение концепции должно работать, но проблема в том, чтобы шаблон работал для меня. Сначала я думал, что добавление typename поможет компилятору понять, что это тип ... но не повезло.

Мне не очень понятно, будет ли этот тип дедукции возможен даже с наложением шаблонов. Любая помощь и указатели на дополнительную информацию помогут.

О, это, кстати, моя ошибка

 main.cpp: In function 'bool g(OT, OT)': main.cpp:39:12: error: parse
 error in template argument list
      return f< TT::typename OPERATOR<OT> >(a,b);

            ^

1 Ответ

0 голосов
/ 03 мая 2018

template забыто и typename в неправильном месте.

Вместо

return f< TT::typename OPERATOR<OT> >(a,b);

вы должны написать

return f< typename TT::template OPERATOR<OT> >(a,b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...