注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Vc与Gcc中模板处理的一个不同之二——从VC移植到GCC中的编译错误  

2014-04-16 11:28:09|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

VcGcc中模板处理的一个不同之二——从VC移植到GCC中的编译错误

继续移植的那个模板工程,在外面重新又封装了一层以后,报了如下的错误:

Type Invalid arguments ' Candidates are:XXX函数参数无效

三个宏来回倒腾就是,在ECLIPSE下发现有一个好处,鼠标移过去后,宏会自动展开,而在VS上则只是宏定义的那个过程或者说声明而没有展开。

但是值得让可气得的是,编译是没有问题的,可以直接生成库。也就是G++编译的过程没有错误。

认认真真的一个个的对了,又喊了同事来认真的对了,确认是没有问题。然后确认可能是类似于VS中的智能感知的错误。在VS中大家是不是在下面的提示栏里经常报智能感知的错误,那个也是不影响编译的。

然后又开始写代码,增加了一部分代码,主要是把原来包含头文件,改成pimpl推荐 pimpl 技法[2, item 43],并考虑多采用 non-member non-friend function in namespace [1, item 23] [2, item 44 abd 57] 作为接口。http://blog.csdn.net/solstice/article/details/6244905)另外见“UML+设计模式中的PIMPL两篇”,主要是在CPP文件中重新包含了生成类的模板头文件,结果开始报下面的错误:

In file included from ../encryption.cpp:19:0:

../classFactory.h: In instantiation of ‘std::shared_ptr<_Tp1> CClassFactory<_AbstractClass, _IdentifierType, _ProductCreator, _FactoryErrorPolicy>::CreateObject(const _IdentifierType&) const [with _AbstractClass = EncryptBase; _IdentifierType = std::basic_string<char>; _ProductCreator = std::shared_ptr<EncryptBase> (*)(); _FactoryErrorPolicy = CDefaultFactoryError<std::basic_string<char>, EncryptBase>]’:

../encryption.cpp:35:19:   required from here

../classFactory.h:101:25: error: ‘OnUnknownType’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]

  return OnUnknownType(id);

                         ^

../classFactory.h:101:25: note: declarations in dependent base ‘CDefaultFactoryError<std::basic_string<char>, EncryptBase>’ are not found by unqualified lookup

../classFactory.h:101:25: note: use ‘this->OnUnknownType’ instead

make: *** [encryption.o] 错误 1

看到那个红色的[-fpermissive]没有,在网上查了下,说是使用最新的G++版本的原因,晕了,降回去是不可能的。还有解决方法是在编译是加-fpermissive选项,但是觉得有点儿不太好。网上还有人说把代码调整,也就是说不使用一些东西,可是这个就更不靠谱了。那么这 选项到底是什么意思呢:

这个说起来就长了,短了说,在GCC4.7前,开源社会是比较松散的,但从4.7后,更加倾向于向CC++的标准靠拢,但是靠拢的结果就是许多开源社区不太符合标准的文件编译出现了问题,所以这个选项的意思就是如果为了兼容老的或者不太符合标准的,就加上它,编译器对代码的检测就会放宽一些。

另外,还有一个需要说明的,就是如果你的头文件包含形成回环,而其中又包括了一些宏控制指令,可能就会出现这个错误。

认真想了想,看了看下面的提示。深蓝色那个。没敢信,觉得这事儿有点儿不太靠谱,结果在网上查发现了这篇文章:http://stackoverflow.com/questions/14016886/mgiza-compile-error

I solved the problem by editing line 220 of src/mkcls/myleada.h

Originally:

insert(typename MY_HASH_BASE::value_type(a,init));

I changed it to:

this->insert(typename MY_HASH_BASE::value_type(a,init));

发现也是用这种方法解决的,于是就按提示改了,结果编译通过了,虽然大致明白其原理,但是没有找到权威的解释,还是有些茫然。先下个记号,回头再来添坑。

  评论这张
 
阅读(572)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017