【问题标题】:Pass templated class to templated function将模板类传递给模板函数
【发布时间】:2017-12-25 09:17:20
【问题描述】:

我有一个非类型模板类:

template<int N> class MyClass; // prototype

还有一个通用的模板函数:

template<class T> Parameters validParams(); // prototype

在模板函数中使用非类型模板类的正确语法是什么?如果我不使用模板类,那么正确的语法是:

template<> Parameters validParams<MyClass>(); // prototype

我环顾四周试图弄清楚这里的语法应该是什么,感谢任何帮助!如果是以下内容,对我来说最有意义,但不是......

template<> Parameters validParams<MyClass<int>>();

使用此代码,我收到以下错误:

expected a constant of size 'int', got 'int'

【问题讨论】:

  • 顺便说一句,使用我猜想的 MyClass 语法,我得到一个错误,例如“预期大小为 'int' 的常量,得到 'int'”

标签: c++ function class templates non-type


【解决方案1】:
template<> Parameters validParams<MyClass<int>>();

应该是这样的

template<> Parameters validParams<MyClass<42>>();
                                       // ^^

【讨论】:

    【解决方案2】:

    看看here.

    MyClass&lt;int&gt; 不是类型(例如,MyClass&lt;42&gt; 是),而函数需要类型(类)的名称作为参数。为了能够将 template 作为其 template 参数,语法必须如下:

    template<template<typename> class T> Parameters validParams();
    

    【讨论】:

      【解决方案3】:

      MyClass 是一个类模板,其模板参数是一个值,而不是一个类型。

      MyClass&lt;0&gt; 该模板的有效实例化,会产生一个类。
      MyClass&lt;int&gt; 不是该模板的有效实例化。 p>

      因此,这条线

      template<> Parameters validParams<MyClass<int>>();
      

      无效。有效的用途是:

      template<> Parameters validParams<MyClass<0>>();
      

      template<> Parameters validParams<MyClass<X>>();
      

      只要X 是编译时间常数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-03
        • 2016-06-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多