2

参照カウント ポインター (SP例で呼び出されます) を実装しましたが、多態性に問題があり、これを行うべきではないと思います。

次のコードでは:

    SP<BaseClass> foo()
    {   
        // Some logic...
        SP<DerivedClass> retPtr = new DerivedClass();
        return retPtr;
    }

DerivedClassから継承しBaseClassます。通常のポインターではこれでうまくいくはずでしたが、スマート ポインターでは"cannot convert from 'SP<T>' to 'const SP<T>&"、スマート ポインターのコピー コンストラクターを参照していると思います。

参照カウント ポインターを使用してこの種のポリモーフィズムを許可するにはどうすればよいですか? この問題が発生している場合、コードサンプルが明らかにここで何か間違ったことをしていることに感謝します。

PS:現時点では不可能なので、スマート ポインターで標準ライブラリを使用するように言わないでください。

4

4 に答える 4

6

かなり明白:

SP<DerivedClass> retPtr = new DerivedClass();

次のようにする必要があります。

SP<BaseClass> retPtr = new DerivedClass();
于 2010-04-21T11:50:34.670 に答える
4

の暗黙的な変換コンストラクターを追加する必要がありますSP<T>

template<class T>
struct SP {
   /// ......
   template<class Y>
   SP( SP <Y> const & r )
    : px( r.px ) // ...
    {
    }

   //....
private:
   T * px;
}
于 2010-04-21T11:58:18.510 に答える
0

テンプレート代入演算子を追加してみませんか:

template <class Base>
class SP
{
    ...

    template<class Derived>
    operator = (SP<Derived>& rhs)
    {
        ...

(そしておそらくコピーコンストラクターも)?

于 2010-04-21T11:57:02.850 に答える
0

コピー コンストラクターに加えて:

SP(const SP<T>& ref);

変換コンストラクターが必要です。

template<typename T2>
SP(const SP<T2>& ref);

そうしないと、コンパイラは;SP<BaseClass>から構築する方法を知りません。SP<DerivedClass>彼にとって、それらは無関係です。

*DerivedClass内部で自動的に変換できるため、変換コンストラクターはかなり自明です*BaseClass。コードは、コピー コンストラクターのコードと非常に似ている場合があります。

于 2010-04-21T12:01:03.213 に答える