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();Adam が言ったように、コピー コンストラクターを探します。

を使用constすると、問題が解決します。それとは別に、一時変数を非 const 参照にバインドすることはできません。

例えば:

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

コピー c-tor のパラメーターが への参照でない場合、gcc でコンパイルされませんconst。ただし、MSVC++ では、MSVC++ (2008 以前) では一時変数を非 const 参照 (悪の拡張) にバインドできるため、上記のコードはコンパイルされます。

ただし、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 に答える