20

const这个模板中关键字的作用是什么?

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix

这是否意味着这个模板只接受一个const作为参数?如果是这样,有没有办法将变量作为COLNUMand传递ROWNUM

(当我尝试将变量作为模板的 COLNUM 传递时,它会给出错误:“IntelliSense:表达式必须具有常量值”)

4

2 回答 2

21

它被忽略:

[C++11: 14.1/4]:非类型模板参数应具有以下类型之一(可选cv-qualified):

  • 整数或枚举类型,
  • 指向对象的指针或指向函数的指针,
  • 对对象的左值引用或对函数的左值引用,
  • 指向成员的指针,
  • std::nullptr_t.

[C++11: 14.1/5]:[注意:其他类型在下面明确或由管理模板参数形式的规则(14.3)隐式禁止。—end note ]模板参数上的顶级cv 限定符确定其类型时会被忽略。

在 C++03 中的相同位置存在相同的措辞。

这部分是因为模板参数必须在编译时知道。所以,不管你有const没有,可能不会传递一些变量值

template <int N>
void f()
{
    N = 42;
}

template <int const N>
void g()
{
    N = 42;
}

int main()
{
    f<0>();
    g<0>();

    static const int h = 1;
    f<h>();
    g<h>();
}

prog.cpp:在函数'<strong>void f() [with int N = 0]'中:
prog.cpp:15:从这里实例化
prog.cpp:4:错误:需要左值作为赋值
prog.cpp的左操作数:在函数'<strong>void g() [with int N = 0]'中:
prog.cpp:16:从这里实例化
prog.cpp:10:错误:需要左值作为赋值
prog.cpp的左操作数:在函数中'<strong>void f() [with int N = 1]':
prog.cpp:19: 从这里实例化
prog.cpp:4: 错误:需要左值作为赋值
prog.cpp 的左操作数: 在函数'<strong >void g() [with int N = 1]':
prog.cpp:20: 从这里实例化
prog.cpp:10: 错误:左值需要作为赋值的左操作数

于 2012-11-17T22:15:24.390 回答
3

const在您的情况下不需要

例如,从编译器的角度来看Matrix_A,两个类和Matrix_B下面的类都是相同的。这只是为了强制执行这一事实,并且对于人类的观点来说是恒定的,但不是必需的。constROWNUMCOLNUM

template <class T, int const ROWNUM, int const COLNUM> 
class Matrix_A 
{
};

template <class T, int       ROWNUM, int       COLNUM> 
class Matrix_B
{
};

此外,以下类还以另一种方式Matrix_C指定了类似的常量变量:ROWNUMCOLNUM

template <class T> 
class Matrix_C
{
   static int const ROWNUM = 5;
   static int const COLNUM = 20;
};

// the following three objects use constant variables ROWNUM and COLNUM
Matrix_A<bool,5,20> a;
Matrix_B<bool,5,20> b;
Matrix_C<bool>      c;
于 2012-11-17T22:24:11.080 回答