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

C++ 无法将模板参数NULL转换为void*,c++,templates,c++03,C++,Templates,C++03,我已经提炼出一个让我困惑的问题,下面是一个最小的例子。基本上,gcc编译器不接受NULL作为void*类型的模板参数 有解决办法吗 请注意,我仅限于C++03 #define NULL 0 template<typename T = void , T* = NULL> struct Foo { }; typedef Foo<> FooType; int main() { } #定义空值0 模板 结构Foo { }; typedef Foo FooType; int

我已经提炼出一个让我困惑的问题,下面是一个最小的例子。基本上,gcc编译器不接受
NULL
作为
void*
类型的模板参数

有解决办法吗

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

#define NULL 0

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

typedef Foo<> FooType;

int main()
{
}
#定义空值0
模板
结构Foo
{
};
typedef Foo FooType;
int main()
{
}

编辑:

您的问题没有解决方案:C++03指针模板参数必须指定一个对象。使用NULL作为非类型模板参数是在C++03之后添加的一个特性

14.3.2模板非类型参数 非类型、非模板参数的模板参数应为以下参数之一:

  • 整型或枚举型的整型常量表达式;或
  • 非类型模板参数的名称;或
  • 具有外部链接的对象或函数的地址,包括函数模板和函数模板id,但不包括非静态类成员,表示为&id表达式,如果名称引用函数或数组,或者如果相应的模板参数是引用,则&id是可选的;或
  • (新)计算结果为空指针值的常量表达式(4.10);或
  • (新)计算结果为空成员指针值的常量表达式(4.11);或
  • 指向构件的指针,如5.3.1所述
一个选项是声明一个“null结构”,其中包含一个成员,您可以使用该成员来代替实
null

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

template<typename T, T* = &null<T>::value>
struct Foo
{
};
模板
结构空值
{
静态T值;
};
模板
结构Foo
{
};
当然,访问
null::value
具有定义良好的语义,不会崩溃;这样做的目的只是为了确保地址与任何其他对象的地址不同


请注意,在任何情况下,您都不可能使用
T=void
。您不能使用
null
解决方案,因为
void
是一个不完整的类型;您不能将任何内容强制转换到
void
指针以用作非类型模板参数。

我在那里看不到
NULL
。@NeilButterworth Fixed.fyi g++5.1.0(C++14)
错误:无法将模板参数“0”转换为“void*”
不,它没有修复,您不能这样使用typedef。发布一些真实的代码。fyi2:
typedef Foo FooType编译。但是
typedef Foo FooType不存在