const
这个模板中关键字的作用是什么?
template <class T, int const ROWNUM, int const COLNUM>
class Matrix
这是否意味着这个模板只接受一个const
作为参数?如果是这样,有没有办法将变量作为COLNUM
and传递ROWNUM
?
(当我尝试将变量作为模板的 COLNUM 传递时,它会给出错误:“IntelliSense:表达式必须具有常量值”)
它被忽略:
[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: 错误:左值需要作为赋值的左操作数
const
在您的情况下不需要
例如,从编译器的角度来看Matrix_A
,两个类和Matrix_B
下面的类都是相同的。这只是为了强制执行这一事实,并且对于人类的观点来说是恒定的,但不是必需的。const
ROWNUM
COLNUM
template <class T, int const ROWNUM, int const COLNUM>
class Matrix_A
{
};
template <class T, int ROWNUM, int COLNUM>
class Matrix_B
{
};
此外,以下类还以另一种方式Matrix_C
指定了类似的常量变量:ROWNUM
COLNUM
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;