C++11模板解析错误,使用模板别名进行类型推导
C++11 template parsing error, type deduction using template alias
我有一个有点愚蠢的问题,模板解析错误在堆栈溢出中很常见,但我没有发现任何与我的问题接近的问题。当我专注于这个问题时,我会让别人证明我错了。
所以我添加了一个神秘但简化的代码片段,它重复了我正在尝试做的事情。
#include <functional>
#include <iostream>
enum selector
{
SEL1,
SEL2,
};
我有特征 classes,我用它来保存一些 "useful"、重复的和静态的信息,我试图将这些信息输入到一个叫做 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>;
};
我创建了一个辅助函数来帮助执行一些对每个特征来说都是独一无二的操作 class。我从 cppreference 复制并修改了这个函数 f()
,因为这是我用作参考的。
template <typename U, typename A, typename B>
bool f(A a, B b, U op = U())
{
return op(a, b);
}
这里我的main函数,姑且称之为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
会帮助编译器找出它是一个类型......但没有运气。
我不太清楚这种推导是否可能 w/template 别名。任何帮助和指向更多信息的指针都会有所帮助。
哦,顺便说一句,这是我的错误
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);
我有一个有点愚蠢的问题,模板解析错误在堆栈溢出中很常见,但我没有发现任何与我的问题接近的问题。当我专注于这个问题时,我会让别人证明我错了。
所以我添加了一个神秘但简化的代码片段,它重复了我正在尝试做的事情。
#include <functional>
#include <iostream>
enum selector
{
SEL1,
SEL2,
};
我有特征 classes,我用它来保存一些 "useful"、重复的和静态的信息,我试图将这些信息输入到一个叫做 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>;
};
我创建了一个辅助函数来帮助执行一些对每个特征来说都是独一无二的操作 class。我从 cppreference 复制并修改了这个函数 f()
,因为这是我用作参考的。
template <typename U, typename A, typename B>
bool f(A a, B b, U op = U())
{
return op(a, b);
}
这里我的main函数,姑且称之为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
会帮助编译器找出它是一个类型......但没有运气。
我不太清楚这种推导是否可能 w/template 别名。任何帮助和指向更多信息的指针都会有所帮助。
哦,顺便说一句,这是我的错误
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);