此模板中const
关键字的效果是什么?
template <class T, int const ROWNUM, int const COLNUM>
class Matrix
这是否意味着此模板仅接受const
作为参数?如果是,有没有办法将变量作为COLNUM
和ROWNUM
?
(当我尝试将变量作为模板的COLNUM传递时,它会出错:“IntelliSense:expression必须具有常量值”)
答案 0 :(得分:19)
它被忽略了:
[C++11: 14.1/4]:
非类型模板参数应具有以下之一(可选 cv-qualified )类型:
- 整数或枚举类型,
- 指向对象或指向函数的指针,
- 对对象的左值引用或对函数的左值引用,
- 指向成员的指针,
std::nullptr_t
。
[C++11: 14.1/5]:
[注意:其他类型在管理 template-arguments (14.3)的形式的规则下明确禁止或隐式禁止。 -end note ] 模板参数上的顶级 cv-qualifiers 在确定其类型时会被忽略
在C ++ 03中的相同位置存在相同的措辞。
这部分是因为无论如何必须在编译时知道模板参数。因此,无论您是否const
,you may not pass some variable value:
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:在函数' void f()[with int N = 0] '中: prog.cpp:15:从这里实例化 prog.cpp:4:错误:作为左操作数分配所需的左值
prog.cpp:在函数' void g()[with int N = 0] ':
prog.cpp:16:从这里实例化 prog.cpp:10:错误:左值作为赋值的左操作数
prog.cpp:在函数' void f()[with int N = 1] ':
prog.cpp:19:从这里实例化 prog.cpp:4:错误:作为左操作数分配所需的左值
prog.cpp:在函数' void g()[with int N = 1] ':
prog.cpp:20:从这里实例化 prog.cpp:10:错误:左值作为赋值的左操作数
答案 1 :(得分:2)
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;