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;