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

Cannot convert template argument NULL to void*

我将一个让我感到困惑的问题提炼成下面显示的最小示例。基本上 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作为非类型模板参数是C++03之后N1905, which came out at least one year中添加的特性

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 struct" 和一个你可以使用的成员而不是真正的 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 指针以用作非类型模板参数。