我有一个赋值运算符。
AP<T>& operator=(AP<T>& o) {Super::operator=(o); return *this; }
当我希望g ++编译器为此代码找到此运算符时。
AP<System> to = System::Create();
我收到了编译错误。
no matching function for call to ‘H::AP<H::System>::AP(H::AP<H::System>)’
ap.cpp:13: note: candidates are: H::AP<T>::AP(H::AP<U>&) [with U = H::System, T = H::System]
ap.cpp:12: note: H::AP<T>::AP(H::AP<T>&) [with T = H::System]
ap.cpp:11: note: H::AP<T>::AP(T*) [with T = H::System]
这是为什么? MSVC编译此代码没有问题。
来源如下。
#include <memory>
namespace H {
template<typename T>
class AP : public std::auto_ptr<T>
{
typedef std::auto_ptr<T> Super;
public:
template<typename U> AP<T>& operator=(AP<U>& o) { Super::operator=(o.release()); return *this; }
AP<T>& operator=(AP<T>& o) { Super::operator=(o); return *this; }
};
class System {
public:
static AP<System> Create();
};
AP<System> System::Create()
{
AP<System> a(new System());
return a;
}
int main()
{
AP<System> to = System::Create();
}
};
AP(const AP<T>& o) : Super(o) { }
,我收到了这些错误。
ap.cpp: In copy constructor ‘H::AP<T>::AP(const H::AP<T>&) [with T = H::System]’:
ap.cpp:33: instantiated from here
ap.cpp:12: error: passing ‘const H::AP<H::System>’ as ‘this’ argument of ‘std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = H::System, _Tp = H::System]’ discards qualifiers
我不知道这是最好的解决方案,但这段代码似乎有效。
int main()
{
H::AP<H::System> tox(H::System::Create().release());
return 0;
}
答案 0 :(得分:1)
AP<System> to = System::Create();
寻找一个复制构造函数。
使用const
可以解决您的问题。除了那个临时工具不能绑定到非const引用。
例如:
AP<System> &ref = AP<System>();
如果您的副本c-tor的参数不是const
的引用,将无法在gcc上编译。但是在MSVC ++上,上面的代码会编译,因为MSVC ++(2008或之前版本)允许temporaries绑定到非const引用(邪恶扩展)。
但是,如果您尝试复制auto_ptr
的副本c you need to implement something similar to auto_ptr_ref
(in order to allow copying temporary auto_ptr
objects)
答案 1 :(得分:0)
它正在寻找一个复制构造函数,而不是operator=
:更仔细地阅读错误消息。您的复制构造函数未正确定义:您需要将其定义为const
引用:
AP(const AP<T>& o) : Super(o) { }
// ^^^^^