我有以下代码:
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 }
奇怪的编译错误:
myfile。h: 在函数int double_to_bulk(double、char*、double, 整数*): myfile。h: 351:错误:isnan没有参数 依赖于模板参数,因此isnan的声明必须是 可获得的 myfile。h: 351:错误:(如果使用-fpermissive,G++将 接受您的代码,但允许使用未声明的名称是 已弃用)
myfile。h: 在函数int double_to_bulk(double、char*、double, 整数*):
myfile。h: 351:错误:isnan没有参数 依赖于模板参数,因此isnan的声明必须是 可获得的
myfile。h: 351:错误:(如果使用-fpermissive,G++将 接受您的代码,但允许使用未声明的名称是 已弃用)
但我真的不想使用 -fpermissive
-fpermissive
我使用 gcc 4.1.2 ,相当老,但与它无关。为什么使用有问题 isnan 在模板函数中?
gcc 4.1.2
isnan
看起来您没有可用的定义 isnan 。您是否在源文件中包含适当的头文件,其中 伊斯南 是否定义了?这里似乎没有任何东西依赖于模板参数。
伊斯南
添加线条 #include<cmath> 应该解决这个问题。
#include<cmath>
如果任何参数依赖于模板参数(例如,如果其中一个参数具有模板参数类型),编译器将仅检查是否存在 isnan 当您实例化模板时,这可能会在稍后导致错误,或者如果您从未使用过模板,则可能根本不会。
请勿使用 -fpermisive ,它可能只会延迟错误链接时间
-fpermisive