C++11 模板解析错误,使用模板别名键入推导



我有一个有点愚蠢的问题,模板解析错误在堆栈溢出中很常见,但我没有找到任何接近我的问题的东西。 当我专注于这个问题时,我会让别人证明我是错的。

所以我添加了一个神秘但简化的代码片段,复制了我正在尝试做的事情。

#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>;
};

我创建了一个帮助程序函数来帮助执行每个 trait 类独有的一些操作。 我已经从cpp首选项f()复制并修改了这个函数,因为这是我用作参考的。

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);
^

template遗忘了,typename在错误的地方。

而不是

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

你应该写

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

最新更新