C++ 模板参数中的常量
此模板中的C++ 模板参数中的常量,c++,templates,constants,C++,Templates,Constants,此模板中的const关键字的效果如何 template <class T, int const ROWNUM, int const COLNUM> class Matrix 模板 类矩阵 这是否意味着此模板仅接受常量作为参数?如果是,是否有方法将变量传递为COLNUM和ROWNUM (当我尝试将一个变量作为模板的COLNUM传递时,它给出了一个错误:“IntelliSense:expression必须有一个常量”)它被忽略: [C++11:14.1/4]:非类型模板参数应具有以
const
关键字的效果如何
template <class T, int const ROWNUM, int const COLNUM>
class Matrix
模板
类矩阵
这是否意味着此模板仅接受常量作为参数?如果是,是否有方法将变量传递为COLNUM
和ROWNUM
(当我尝试将一个变量作为模板的COLNUM传递时,它给出了一个错误:“IntelliSense:expression必须有一个常量”)它被忽略:
[C++11:14.1/4]:
非类型模板参数应具有以下类型之一(可选cv限定):
- 整型或枚举型
- 指向对象的指针或指向函数的指针
- 对对象的左值引用或对函数的左值引用
- 指向成员的指针
std::nullptr\u t
[C++11:14.1/5]:
[注意:模板参数形式的规则(14.3)在下面显式或隐式禁止其他类型。-结束注意]在确定模板参数类型时,忽略模板参数上的顶级cv限定符
在C++03中,相同的措辞出现在相同的位置
这部分是因为模板参数必须在编译时已知。因此,无论是否有const
:
模板
void f()
{
N=42;
}
模板
void g()
{
N=42;
}
int main()
{
f();
g();
静态常数int h=1;
f();
g();
}
prog.cpp:在函数“void f()[带int N=0]”中:prog.cpp:15:从此处实例化
程序cpp:4:错误:赋值的左操作数需要左值
prog.cpp:在函数“void g()[带int N=0]”中:
prog.cpp:16:从此处实例化
程序cpp:10:错误:赋值的左操作数需要左值
prog.cpp:在函数“void f()[带int N=1]”中:
prog.cpp:19:从此处实例化
程序cpp:4:错误:赋值的左操作数需要左值
prog.cpp:在函数“void g()[带int N=1]”中:
prog.cpp:20:从此处实例化
程序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
{
};
这很奇怪,因为当我尝试传递一个变量作为模板的COLNUM时,它给出了一个错误:“IntelliSense:表达式必须有一个常量”@Chin:为什么这样奇怪?模板参数必须在编译时已知,因为在编译时模板才会展开。我明白了。那么,有没有办法在运行时做到这一点呢?@Chin:当然,只要使用普通的函数参数就行了。可能是类构造函数的参数。@Yakk:Pfft:P顺便说一句,第44行看起来不正确(如所示),所以它不是
常量所做的。你是对的。我错了:-(.谢谢@LightnessRacesinOrbit的编译测试;-)现在一切都应该好了。干杯
template <class T, int const ROWNUM, int const COLNUM>
class Matrix_A
{
};
template <class T, int ROWNUM, int COLNUM>
class Matrix_B
{
};
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;