【问题标题】:"Template argument for template template parameter must be a class template or type alias template"“模板模板参数的模板参数必须是类模板或类型别名模板”
【发布时间】:2014-01-29 16:25:17
【问题描述】:
template<typename... TArgs> struct List { };
template<template<typename...> class> struct ListHelper;
template<typename T, typename... TArgs> struct ListHelper<List<T, TArgs...>> { };
                                                          ^
   /*Error: Template argument for template template parameter 
             must be a class template or type alias template*/

怎么了?我正在使用 clang++ SVN。

【问题讨论】:

  • 显示错误的模板实例是什么,或者模板是否已经因包含而失败?
  • @πάνταῥεῖ 没有实例化。这实际上是程序中的所有代码(int main() { return 0; } 除外)
  • 我喜欢这个错误信息:3 个单词中有 1 个是“模板”。

标签: c++ templates c++11 clang variadic-templates


【解决方案1】:

您有一个模板模板参数。您必须传递一个模板作为其参数。相反,您将模板实例化作为其参数传递 - 这是一个具体的类,而不是模板(它的所有参数都是绑定的)。

考虑:

template <template<typename> typename X>
class WantsTemplate {};

template <typename>
class ATemplate {};

WantsTemplate<ATemplate> wt1;  // OK
WantsTemplate<ATemplate<int> > wt2;  // not OK

【讨论】:

    【解决方案2】:

    模板模板参数需要模板,而不是它的实例化。这个:

    template<typename T, typename... TArgs> struct ListHelper<List> { };
    //                               only the template itself ^^^^
    

    如果你想通过List&lt;T,TArgs...&gt;,这是一个类,你需要

    template<typename T> struct ListHelper;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2011-05-10
      • 2023-01-25
      相关资源
      最近更新 更多