C++ 为什么可以';t NULL是否为函数指针模板参数?

C++ 为什么可以';t NULL是否为函数指针模板参数?,c++,templates,c++11,C++,Templates,C++11,当我试图在GCC或clang中编译它时,我得到了一个错误 #包括 模板 空包装器() { } int main() { void(*meow)()=包装纸; 回喵?1:0; } $g++-m64-std=c++11-c nulltemplate.cpp nulltemplate.cpp:在函数“int main()”中: nulltemplate.cpp:10:19:错误:将函数“Wrapper”转换为类型“void(*)()”时没有匹配项 nulltemplate.cpp:4:6:错误:候选

当我试图在GCC或clang中编译它时,我得到了一个错误

#包括
模板
空包装器()
{
}
int main()
{
void(*meow)()=包装纸;
回喵?1:0;
}
$g++-m64-std=c++11-c nulltemplate.cpp
nulltemplate.cpp:在函数“int main()”中:
nulltemplate.cpp:10:19:错误:将函数“Wrapper”转换为类型“void(*)()”时没有匹配项
nulltemplate.cpp:4:6:错误:候选项为:模板无效包装器()

为什么我不能这样做?错误的措辞就像是
包装器
是一个重载,无法在上下文中解析为特定的函数指针类型,这对我来说毫无意义。

NULL
是一个宏,可以定义为(并且在您的系统上似乎是):

它的类型为
int
。因此,您的代码正在进行
包装

但是,对于作为函数指针的非类型模板参数,必须传递实际函数指示符或空指针值。不考虑从整数到指针的隐式转换
0
是空指针常量,但不是空指针值

C++11引入了
nullptr
,以避免此类问题
nullptr
不能与整数混淆


非类型模板参数的完整列表,以及其中考虑转换的列表,可以在C++标准的Time.Ag.NoType中找到。

替代使用代码> NulLPTR < /C>。您的实现上的code>NULL不是指针类型。这不需要是
NULL
的定义,也不在Clang或GCC上。
#define NULL 0