template < int >
class CAT
{};
int main()
{
int i=10;
CAT<(const int)i> cat;
return 0; //here I got error: ‘i’ cannot appear in a constant-expression
}
甚至
int i=10;
const int j=i;
CAT<j> cat; //this still can not work
但我已将i转换为const int,为什么编译器仍报告错误?
我的平台是ubuntu,gcc版本4.4.3
谢谢,
==============
感谢所有人的输入,但在某些情况下,我需要一个非const变量,
例如:
//alloperations.h
enum OPERATIONS
{
GETPAGE_FROM_WEBSITE1,
GETPAGE_FROM_WEBSITE2,
....
};
template< OPERATIONS op >
class CHandlerPara
{
static string parameters1;
static string parameters2;
....
static void resultHandler();
};
//for different operations,we need a different parameter, to achieve this
//we specified parameters inside CHandler, for example
template<>
string CHandlerPara< GETPAGE_FROM_WEBSITE1 >::parameters1("&userid=?&info=?..")
template<>
string CHandlerPara< GETPAGE_FROM_WEBSITE1 >::parameters2("...")
其他模块将使用此模板获取相应的参数
并且可能将resultHandler函数指定为特殊行为
答案 0 :(得分:18)
非类型模板参数需要是编译时常量。将int
转换为const int
并不会使其成为编译时常量。您需要直接使用10
:
CAT<10> cat;
或使i
成为const int
:
const int i = 10;
CAT<i> cat;
答案 1 :(得分:9)
了解哪些模板很重要:它们是针对特定模板类型或值的每种组合重新实例化的代码。
void f(const int j) { CAT<j> cat; }
这要求f
每次运行时创建不同类型的CAT<>
,但必须在编译时解析模板。从概念上讲,如果您只使用在编译时可以解决的值调用f()
,编译器可能会应对,但如果您计划这样做,那么您只需编写:
template <int N>
void f() { CAT<N> cat; }
此将生成多个f()
函数,用于创建自定义CAT&lt;&gt;实例
C ++标准甚至没有要求编译器暂时接受void f(const int j)
版本 - 当有人在运行时确定使用它时,它只会是等待失败的可疑行李。在没有查看整个实现的情况下查看界面的人会期望f()
可以使用这样的运行时值来调用 - 例如f(atoi(argv[2]))
。或者,他们可能会for (int i = 0; i < 100000; ++i) f(i)
。如果f()
在运行时获取int
,并且说它将CAT
作为构造函数参数(即作为运行时参数而不是模板参数),那么这很好,但是,如果编译器必须实例化100,000个f()
版本的CAT<>
,每个版本i/N
具有连续值{{1}},则可执行程序的大小可能变得很大(优化 - 如果启用 - 可以减轻)。