下面这段代码,在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?