C++11模板解析错误,使用模板别名进行类型推导

标签 c++ c++11 templates template-specialization template-argument-deduction

我有一个有点愚蠢的问题,模板解析错误在堆栈溢出中很常见,但我没有发现任何与我的问题接近的问题。当我专注于这个问题时,我会让其他人证明我错了。

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

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

            ^

最佳答案

template 被遗忘,typename 位置错误。

代替

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

你应该写

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

关于C++11模板解析错误,使用模板别名进行类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50158109/

相关文章:

c++ - 如何在 Netbeans 中为 C++ 制作应用程序图标

c++ - 结构的动态聚合初始化的正确形式?

c++ - lambdas 的调用操作符是否需要链接?

c++ - 为什么在使用可变参数函数时必须将 CString 强制转换为 LPCSTR?

c++ - 为什么auto_ptr中有模板复制构造函数和重写操作函数?

c++ - 令我惊讶的是,这段代码可以正确编译和执行。这里发生了什么事?

c++ - 如何在不进行类型转换和使用多态性的情况下使用基类指针调用派生类非虚成员函数?

c++ - 如何用 C++ 数组初始化 OpenCL 常量 vector ? [主持人]

c++ - 使用 Variadic 模板的困难

templates - Go html模板如何从funcMap获取函数中的用户IP