模板模板部分特化失败:“期望一个类模板”

Posted

技术标签:

【中文标题】模板模板部分特化失败:“期望一个类模板”【英文标题】:Template template partial specialization failure: "expected a class template" 【发布时间】:2016-07-25 08:14:54 【问题描述】:

此示例代码生成expected a class template, got std::pair <_T1, _T2>。我尝试使用struct Struct <std::pair> ;,但随后参数TM 变得无法推断。如何避免这种情况?

    template <template <class...> class>
    struct Struct ;

    template <class T, class M>
    struct Struct <std::pair <T, M>> ;

【问题讨论】:

std::pair 是类模板,std::pair &lt;_T1, _T2&gt; 不是。您可以将主模板声明更改为template &lt;class&gt; struct Struct ; 【参考方案1】:

取决于你想要什么

template <template <class...> class>
struct Struct ;

template <>
struct Struct <std::pair>

    // Specialization
;

template <typename> struct Struct ;

template <typename First, typename Second>
struct Struct <std::pair<First, Second>>

    // Specialization
;

【讨论】:

【参考方案2】:

这不是您的模板的有效特化。

原因是因为std::pair&lt;T, M&gt; 是类模板std::pair 的完全特化,因此是一个类。您的模板需要一个类模板参数,这正是编译器告诉您的。

【讨论】:

以上是关于模板模板部分特化失败:“期望一个类模板”的主要内容,如果未能解决你的问题,请参考以下文章

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++,2参数类模板的部分特化:无法将函数定义与现有声明匹配

派生类中类模板的部分特化会影响基类

C++模板—部分特化

模板的全特化与偏特化