【发布时间】:2012-09-29 02:09:22
【问题描述】:
我从一堆其他 Stackoverflow 线程(如 this)中了解到,模板参数是在编译时评估的。 此外,非类型模板参数应该是常量表达式、整数表达式或指向具有外部链接的对象的指针。
而且,我没有在 Makefile 的 g++ 命令中使用 --std=c++0x。
那么,是否可以用 NULL 作为参数来实例化模板类?
// I have a template class like this -
template<class T, T invalidVal, int e> class A
{
static inline bool dummy(T value)
{
return 0;
}
}
#define MY_INVALID_VAL ((void *)0)
// Now I want create class from the above template class with
// T=void*, invalidVal=NULL & e=0
typedef A<void *, MY_INVALID_VAL, 1> ClassA;
以上代码在 MS Visual Studio 2008 上编译良好。 在 g++ 上 - 我收到错误 - “转换为整数或枚举类型以外的类型不能出现在常量表达式中”
我在谷歌搜索后尝试了一些选项 -
声明“extern void *MY_INVALID_VAL;”在头文件中 - 包含它并执行 无效 MY_INVALID_VAL=NULL;在模板实例化之前。 在这种情况下,我收到错误“MY_INVALID_VAL 不是类型 'void' 的有效模板参数,因为它不是常量指针”
所以我的问题是—— 不使用 c++0x 标准就没有办法用 NULL 参数实例化模板类吗?
谢谢!
编辑:
感谢所有 cmets 并感谢您引用标准草案中的确切部分。
只列出我尝试过的东西 -
1) 直接传递“0”是行不通的。 我得到的错误是 - “无法将 '0' 转换为模板参数 void *”
2) 声明静态 const void *my_null=0;并且传递 my_null 不起作用。 它给出了错误 - “my_null 不能出现在常量表达式中”
3) 尝试了其中一个 cmets 中建议的指向空对象的指针(空对象模式)方法 见下文-
class my_null
{
public:
my_null() { my_null_ptr = NULL; }
void * get() { return my_null_ptr; }
private:
void *my_null_ptr;
};
my_null my_null_obj;
my_null *ptr = &my_null_obj;
typedef A<void *, (void *)ptr, 1> ClassA;
我仍然收到错误 - “ptr 不能出现在常量表达式中”
所以现在这让我想知道 - 我应该传递什么值才能使其工作? 或者有没有可能使它工作? (我的意思是一种不涉及使用 c++11 std 的方式) 我还没有找到一个可以成功编译的值。
任何帮助表示赞赏(并且需要:-P)!
作为旁注,我想问的另一件事是 - 是否有任何指针值可以用于非类型模板参数?
【问题讨论】:
-
您是否尝试过只传递
0而没有强制转换作为参数? -
我做到了 - 第一次 - 但后来它说 - 无法将“0”转换为模板参数“void *”。因此包括了类型转换。