返回   cpper编程论坛 > C/CPP/TMP/GP
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2008-01-10
wqqafnd 的头像
高级会员
 
注册日期: 2004-10-08
帖子: 196
文章: 1
wqqafnd 正向着好的方向发展
发送 MSN 消息给 wqqafnd
默认 这个是gcc的bug吗?

下面这段代码,在VC8里编译运行正常,但是在gcc(版本4.1.2 20070925)里编译不过:
代码:
#include <iostream> using namespace std; class CMutexGuard { CMutexGuard(const CMutexGuard &); CMutexGuard & operator =(const CMutexGuard &); public: explicit CMutexGuard(int m){ cout<<"CMutexGuard(int)\n"; } ~CMutexGuard(){ cout<<"~CMutexGuard()\n"; } }; template<class T> class __lockPointer{ typedef T * pointer; typedef T & reference; pointer p_; CMutexGuard g_; public: __lockPointer(pointer p,int m):p_(p),g_(m){ cout<<"__lockPointer(pointer,int)\n"; } //__lockPointer(const __lockPointer & x); //g++的bug? pointer operator ->(){return p_;} reference operator *(){return *p_;} }; template<class T> class CLockObject { typedef __lockPointer<T> __Locked; public: typedef T & reference; explicit CLockObject(T & r):ref_(r){} __Locked LockPointer(){ return __Locked(&ref_,m); //这里要调用__lockPointer(const __lockPointer &)吗? } private: reference ref_; int m; }; int main() { int x = 0; CLockObject<int> px(x); *px.LockPointer() = 3; cout<<x<<endl; }
问题出在CMutexGuard的拷贝构造上,因为我禁用了,所以出错,gcc的出错信息如下:
代码:
1.cpp: In copy constructor '__lockPointer<int>::__lockPointer(const __lockPointer<int>&)': 1.cpp:19: instantiated from '__lockPointer<T> CLockObject<T>::LockPointer() [with T = int]' 1.cpp:53: instantiated from here 1.cpp:7: 错误:'CMutexGuard::CMutexGuard(const CMutexGuard&)'是私有的 1.cpp:19: 错误:在此上下文中 1.cpp: In member function '__lockPointer<T> CLockObject<T>::LockPointer() [with T = int]': 1.cpp:42: 附注:在这里第一次需要生成的方法 '__lockPointer<int>::__lockPointer(const __lockPointer<int>&)'
我的理解就是
代码:
__Locked LockPointer(){ return __Locked(&ref_,m); //这里要调用__lockPointer(const __lockPointer &)吗? }
调用了lockPointer的拷贝构造函数__lockPointer(const __lockPointer &)。
但是我把__lockPointer(const __lockPointer &)申明而不实现,gcc就能编译运行正确了,那么__lockPointer(const __lockPointer &)实际上应该没有被调用(否则没有实现也应该出错),所以我现在搞不懂为什么了,是不是gcc的一个bug?

此帖于 2008-01-10 12:15 PM 被 wqqafnd 编辑. 原因: 代码怎么没显示出来?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2008-01-10
summersnowe2006 的头像
普通会员
 
注册日期: 2006-02-14
帖子: 74
summersnowe2006 正向着好的方向发展
默认 回复: 这个是gcc的bug吗?

出错信息还是中文的啊~~~
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2008-01-10
高级会员
 
注册日期: 2002-09-16
帖子: 1,087
文章: 1
SpitFire 正向着好的方向发展
默认 回复: 这个是gcc的bug吗?

__Locked LockPointer(){
return __Locked(&ref_,m); //这里要调用__lockPointer(const __lockPointer &)吗?
}

这里是需要调用__lockPointer的copy ctor的,而编译器你生成的__lockPointer的copy ctor要调用成员CMutexGuard的copy ctor
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2008-01-10
wqqafnd 的头像
高级会员
 
注册日期: 2004-10-08
帖子: 196
文章: 1
wqqafnd 正向着好的方向发展
发送 MSN 消息给 wqqafnd
默认 回复: 这个是gcc的bug吗?

引用:
作者: SpitFire 查看帖子
__Locked LockPointer(){
return __Locked(&ref_,m); //这里要调用__lockPointer(const __lockPointer &)吗?
}

这里是需要调用__lockPointer的copy ctor的,而编译器你生成的__lockPointer的copy ctor要调用成员CMutexGuard的copy ctor
没有调用吧,如果真的实现了__lockPointer(const __lockPointer &),比如这样:
代码:
__lockPointer(const __lockPointer & x) //g++的bug? { cout<<"__lockPointer(const __lockPointer &)\n"; }
gcc编译运行的结果里并没有打印出这条信息:
代码:
CMutexGuard(int) __lockPointer(pointer,int) ~CMutexGuard() 3
我能想到的唯一的解释是:gcc编译了__lockPointer(const __lockPointer & x),但是在生成的代码里又去掉了。这一点vc8似乎更做的更好,在编译的时候就优化掉了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2008-01-10
高级会员
 
注册日期: 2002-09-16
帖子: 1,087
文章: 1
SpitFire 正向着好的方向发展
默认 回复: 这个是gcc的bug吗?

没调用是优化掉了,但语义上是需要的,这方面g++的符合标准的
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 06:45 PM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2009,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0