0

我有一个赋值运算符。

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

添加2

我不知道这是最好的解决方案,但这段代码似乎有效。

int main()
{
  H::AP<H::System> tox(H::System::Create().release());
  return 0;
}
4

2 回答 2

1

AP<System> to = System::Create();正如亚当所说,寻找一个复制构造函数。

使用const将解决您的问题。除此之外,临时对象不能绑定到非常量引用。

例如:

AP<System> &ref = AP<System>(); 

如果您的副本 c-tor 的参数不是对const. 但是在 MSVC++ 上,上面的代码可以编译,因为 MSVC++(2008 或更早版本)允许临时对象绑定到非常量引用(邪恶扩展)。

但是,如果您尝试复制auto_ptr的复制 c-tor ,您需要实现类似的东西auto_ptr_ref(为了允许复制临时auto_ptr对象)

于 2011-03-21T04:29:03.663 回答
0

它正在寻找一个复制构造函数,而不是operator=: 更仔细地阅读错误消息。您的复制构造函数定义不正确:您需要将其定义为const参考:

AP(const AP<T>& o) : Super(o) { }
// ^^^^^
于 2011-03-21T04:19:12.097 回答