У меня немного тупой вопрос, ошибки синтаксического анализа шаблонов так часто встречаются при переполнении стека, но я не нашел ничего похожего на мою проблему. Я позволю кому-то еще доказать, что я не прав, пока сосредоточусь на этом вопросе.
Поэтому я добавил загадочный, но упрощенный фрагмент кода, который дублирует то, что я пытаюсь сделать.
#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);
^