模板变量"列表"不起作用?

Template variable `list` doesn't working?

本文关键字:不起作用 列表 变量      更新时间:2023-10-16

我有以下模板类:

template <class T, list<int> t> 
class Tops
{
private:
    list<stack<T>> tops;
public:
    list getTops() {
    }
};

它不编译为:illegal type for non-type template parameter 't'

第6行:template <class T, list<int> t> class Tops

当我将list<int>更改为类型int时,它就工作了。问题出在哪里?

template <class T, list<int> t>更改为template <class T, list<int> &t>:

template <class T, list<int> &t>   
                             ^^^  //note &t
class Tops
{
private:
    list<stack<T>> tops;
public:
    list getTops() {
    }
};

不能这样做的原因是,在编译时无法解析和替换非常量表达式。它们可能在运行时发生变化,这需要在运行时生成一个新模板,这是不可能的,因为模板是一个编译时概念。

以下是标准允许的非类型模板参数(14.1[temp.param]p4):

A non-type template-parameter shall have one of the following 
(optionally cv-qualified) types:
 - integral or enumeration type,
 - pointer to object or pointer to function,
 - reference to object or reference to function,,
 - pointer to member.

来源答案:https://stackoverflow.com/a/5687553/1906361

template的参数在编译时解析。

模板参数必须是常量表达式、函数/对象/静态成员的地址或对象的引用。

我想你在找这个:

template <class T,list<int> &t> 
class Tops
{
private:
    list<stack<T>> tops;
public:
    list<stack<T> > getTops() {
    }
};