由于标题长度的限制,只截取了关键词
比较完整的错误描述是: error: there are no arguments to '*' (这里 ‘*‘ 代表某个函数名,比如 'memset') that depend on a template parameter, so a declaration of '*' must be available
接着是错误发生位置的描述。
比如以下是在编译mldonkey这个软件的时候产生的错误描述
> src/utils/lib/CryptoPP.h:2271: error: there are no arguments to 'memset' that
> depend on a template parameter, so a declaration of 'memset' must be available
> src/utils/lib/CryptoPP.h:2271: error: (if you use '-fpermissive', G++ will
> accept your code, but allowing the use of an undeclared name is deprecated)
这些错误是linux新版本的gcc 4.3取消了头文件多层关联造成的.
在本例中,简单得理解错误信息是 CryptoPP.h 文件少了对memset函数的声明。实际上,memset函数是c语言函数库的基本函数,属于string.h的成员函数. 只要#include <string.h>即可。
而错误发生在这里, 主要是因为在之前的gcc版本中,只要CryptoPP.h包含的任何一个头文件里面含有#include <string.h>即可,编译器可以从当前文件包含的文件里多层地链接到c语言的string.h这个库。而现在多层链接功能失去了,于是在CryptoPP.h里用到的memset函数就成了来路不明的函数了。解决方法就是在CryptoPP.h里面加上#include <string.h>这么句话。
针对类似的错误,同样也是把缺失的函数声明补上。从目前的实践结果看,缺失声明的情况主要集中在几类:
http://www.cyrius.com/journal/2007/05/10#gcc-4.3-include
这个网站对这么几种情况进行了统计。
当然这个网站是用c++类库的名称表示的,如果你的程序是c,那么请相应地转换成c的库。
比如在本例中,memset 跟memcpy是属于一个库的,查询这个网站可以知道它属于c++里的cstring库,而cstring库对应于c的string.h库。
于是,这个由于gcc变化而引入的错误就解决了。
原文出处:http://geniuszhe.blog.163.com/blog/static/119346820131209171225/
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
当然了,如果是QT5转QT4的opencv,则可尝试在所缺函数前加作用域。如:
error: there are no arguments to 'max' that depend on a template parameter, so a declaration of 'max' must be available [-fpermissive]
RealType *tempResult = new RealType[max(rows, cols)];
^
只需将 RealType *tempResult = new RealType[max(rows, cols)];改为
RealType *tempResult = new RealType[cv::max(rows, cols)];