gpt4 book ai didi

c++ - 无法将模板参数 NULL 转换为 void*

转载 作者:行者123 更新时间:2023-11-30 02:22:08 25 4
gpt4 key购买 nike

我将一个让我感到困惑的问题提炼为下面显示的最小示例。基本上,gcc 编译器不接受 NULL 作为 void* 类型的模板参数。

有解决办法吗?

请注意,我仅限于 C++03。

#define NULL 0

template<typename T = void , T* = NULL>
struct Foo
{
};

typedef Foo<> FooType;

int main()
{
}

编辑:online version

最佳答案

您的问题没有解决方案:C++03 指针模板参数必须指定一个对象。使用 NULL 作为非类型模板参数是在 N1905 中添加的一项功能,出来了at least one year在 C++03 之后。

14.3.2 Template non-type arguments

A template-argument for a non-type, non-template template-parameter shall be one of:

  • an integral constant-expression of integral or enumeration type; or
  • the name of a non-type template-parameter; 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 optional if the name refers to a function or array, or if the corresponding template-parameter is a reference; or
  • (NEW) a constant expression that evaluates to a null pointer value (4.10); or
  • (NEW) 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.

一个选项是声明一个“空结构”,其中包含一个您可以使用的成员,而不是真正的 NULL。 :

template<typename T>
struct null
{
static T value;
};

template<typename T, T* = &null<T>::value>
struct Foo
{
};

当然,访问null<T>::value具有明确定义的语义并且不会崩溃;目的只是为了有一个保证与任何其他对象的地址不同的地址。

请注意,无论如何,您都不可能使用T = void。 .你不能使用 null解决方法是因为 void是不完整的类型;你不能将任何东西转换到 void用作非类型模板参数的指针。

关于c++ - 无法将模板参数 NULL 转换为 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47664905/

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