【问题标题】:C++11 template parsing error, type deduction using template aliasC++11模板解析错误,使用模板别名进行类型推导
【发布时间】:2018-05-03 14:57:14
【问题描述】:

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

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

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

我创建了一个辅助函数来帮助执行每个特征类独有的一些操作。我已经从 cppreference 复制并修改了这个函数 f(),因为这是我用作参考的函数。

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

在我的主函数中,我们称之为g(),是我调用f&lt; TT::typename OPERATOR&lt;OT&gt; &gt;(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);

            ^

【问题讨论】:

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


    【解决方案1】:

    template 忘记了,typename 放错地方了。

    而不是

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

    你应该写

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

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2016-06-01
      • 2014-09-22
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2020-07-09
      • 2021-12-27
      相关资源
      最近更新 更多