C++ 无法将模板参数NULL转换为void*
我已经提炼出一个让我困惑的问题,下面是一个最小的例子。基本上,gcc编译器不接受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
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
:
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代码>不存在