C++ 在模板函数中使用isnan
我有以下代码:C++ 在模板函数中使用isnan,c++,templates,macros,gcc4,C++,Templates,Macros,Gcc4,我有以下代码: template<int FORMAT> int double_to_bulk(double value, char* buf, double max_num, int* state = NULL) { if (isnan(value)) { //Something to do
template<int FORMAT>
int double_to_bulk(double value,
char* buf,
double max_num,
int* state = NULL)
{
if (isnan(value))
{
//Something to do
return 1;
}
//Something more to do
}
模板
int double_到_bulk(双倍值,
char*buf,
双倍最大值,
int*state=NULL)
{
如果(isnan(值))
{
//有事可做
返回1;
}
//还有别的事要做吗
}
奇怪的编译错误:
h:在函数“int double”到“bulk”(double,char*,double,
int*)':
myfile.h:351:错误:“isnan”没有参数
依赖于模板参数,因此必须声明'isnan'
可用
myfile.h:351:error:(如果使用'-fppermissive',G++将
接受您的代码,但允许使用未声明的名称是错误的
不推荐)
但是我真的不想使用-fpermissive
我使用的是
GCC4.1.2
,非常旧,但与之无关。为什么在模板函数中使用isnan
会出现问题?看起来您没有可用的isnan
定义。您是否在源代码中包含定义了isnan
的相应头文件?这里似乎没有任何东西依赖于模板参数。添加行#include
应该可以解决问题
如果任何参数确实依赖于模板参数(例如,如果其中一个参数具有模板参数类型),则编译器将仅在实例化模板时检查是否存在isnan
,这可能会在稍后导致错误,或者如果从未使用模板,则可能根本不会导致错误
不要使用
-fpermissive
,这可能只是将错误延迟到链接时间是,将其移出到另一个函数表明未定义它。我只是被编译器的这种信息弄糊涂了。在C99中,它是以宏的形式存在的。是的,它只是没有定义。我只是被这种奇怪的信息弄糊涂了。