gpt4 book ai didi

c++ - 使用 NULL 参数实例化模板类

转载 作者:太空狗 更新时间:2023-10-29 20:28:39 25 4
gpt4 key购买 nike

我从一堆其他 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;”在头文件中 - 包含它并执行 void MY_INVALID_VAL=NULL;在模板实例化之前。 在那种情况下,我得到错误“MY_INVALID_VAL 不是类型‘void’的有效模板参数,因为它不是常量指针”

所以我的问题是 -有没有办法在不使用 c++0x 标准的情况下实例化带有 NULL 参数的模板类?

谢谢!

编辑:

感谢所有评论,并感谢您引用标准草案中的确切部分。

只是列出我尝试过的东西 -

1) 直接传递“0”是行不通的。 我得到的错误是 - “无法将‘0’转换为模板参数 void *”

2) 声明 static const void *my_null=0;并且传递 my_null 不起作用。 它给出了错误 - “my_null 不能出现在常量表达式中”

3) 尝试了其中一条评论中建议的指向空对象的指针(空对象模式)方法 见下文-

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)!

作为旁注,我想问的另一件事是 - 是否有任何指针值可用于非类型模板参数?

最佳答案

C++98 说非类型模板参数应该是其中之一

  • an integral constant-expression of integral or enumeration type; or
  • the name of a non-type template-parameter; or
  • the name of an object or function with external linkage, including function templates and function template-ids but excluding non-static class members, expressed as id-expression; or
  • the address of an object or function with external linkage, including function templates and function template-ids but excluding non-static class members, expressed as &id-expression where the & is option if the name refers to a function or array; or
  • a pointer to member expressed as described in 5.3.1.

空指针不属于此列表的任何项目,因此将空指针作为非类型模板参数传递是无效的。

C++11 将此列表更新为

  • for a non-type template-parameter of integral or enumeration type, a converted constant expression (5.19) of the type of the template-parameter; or
  • the name of a non-type template-parameter; or
  • a constant expression (5.19) that designates the address of an object with static storage duration and external or internal linkage or a function with external or internal linkage, including function templates and function template-ids but excluding non-static class members, expressed (ignoring parentheses) as & id-expression, except that the & may be omitted if the name refers to a function or array and shall be omitted if the corresponding template-parameter is a reference; or
  • a constant expression that evaluates to a null pointer value (4.10); or
  • a constant expression that evaluates to a null member pointer value (4.11); or
  • a pointer to member expressed as described in 5.3.1.

更新后的要求确实涵盖了空指针。因此,要将空指针用作非类型模板参数,您必须使用 C++11。

关于c++ - 使用 NULL 参数实例化模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12632696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com