无法将模板参数 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()
{
}
你的问题无解: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
指针以用作非类型模板参数。
我将一个让我感到困惑的问题提炼成下面显示的最小示例。基本上 gcc 编译器不接受 NULL
作为类型 void*
.
有解决办法吗?
请注意,我仅限于 C++03。
#define NULL 0
template<typename T = void , T* = NULL>
struct Foo
{
};
typedef Foo<> FooType;
int main()
{
}
你的问题无解: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
指针以用作非类型模板参数。