2

別のタイプからの割り当てで初期化できるが、コピーできないタイプを作成しようとしています。このタイプのオブジェクトがその存続期間中リソースを所有するようにしたいという点で、スコープ付きスマートポインターの考え方と似ていますが、割り当て構文も使用できるようにしたいのです。あらすじでは、これが私が欲しいものです:

T x = new U; // allowed
T y(new U);  // allowed
T z = x;     // not allowed
T x2(x)      // not allowed

これは私がこれまでに試したことです...

#include <boost/noncopyable.hpp>

class U {};

class T : boost::noncopyable {
public:
    T(U *p) : p_(p) {
    }

    ~T() {
        delete p_;
    }

    operator bool() const { return p_ != 0; }

private:
    U *p_;
};

int main() {
    T x = new U; // allowed
    T y(new U);  // allowed
    //T z = x;     // not allowed
    //T x2(x)      // not allowed
}

残念ながら、エラーが発生します。

$ g ++ test.cc -o test /usr/include/boost/noncopyable.hpp:コピーコンストラクター内'T :: T(const T&)':/usr/include/boost/noncopyable.hpp:27:7:エラー: 'boost :: noncopyable _ :: noncopyable :: noncopyable(const boost :: noncopyable _ :: noncopyable&)'はプライベートtest.cc:6:30:エラー:このコンテキスト内test.cc:関数'int main()': test.cc:20:12:注:ここで最初に必要な合成メソッド'T :: T(const T&)'

注:C ++ 11の移動機能は、C ++ 11をサポートしていない比較的古いバージョンのgccでコンパイルできる必要があるため、私にはオプションではありません。

C ++ 11のサポートがないため、「良い」解決策があるかどうかはわかりません。しかし、私は私が尋ねると思いました。

4

1 に答える 1

1

コメントからの私の理解が正しければ、次のようなものが必要です。

U* create_T() { return new U; }
if (T t = create_T())
{
  // do something with t
}

ここでの問題は、すでにコメントで言及されています。この構文T t = uは、コピー コンストラクターを呼び出しているだけです。u がタイプのT場合、次と同等ですT t(u)。あなたの例のように、が( ) にu変換可能な別の型である場合、実際にはこれです: 。したがって、ここに、コンパイラが文句を言うコピー コンストラクターがあります。There by T::T(U*)T t(T(u))

ifこれは有効な構文ではないため、解決策はありません。

if (T i(create_T())) {}

ただし、適切なアドバイスなしにこれらすべてを書くことはできません;)

次の構文を使用すると、コピー コンストラクターの問題を忘れることができます。

if (U* u = create_T()) {
   T t(u);
   ....
} 

ところで、std::auto_ptrあなたのタイプと同じ問題がありますTT(U*)コンストラクターに明示的に追加するだけで、次のような類似点が表示されauto_ptrます。

class U {};

class T : boost::noncopyable {
public:
    explicit T(U *p) : p_(p) {
    }

    ~T() {
        delete p_;
    }

private:
    U *p_;
};

int main() {
    T x = new U; // allowed
    T y(new U);  // allowed
    std::auto_ptr<U> a = new U;
    std::auto_ptr<U> b(new U);
}

結果:

prog.cpp:25: error: conversion from ‘U*’ to non-scalar type ‘T’ requested
prog.cpp:27: error: conversion from ‘U*’ to non-scalar type ‘std::auto_ptr<U>’ requested

ここで私のアイデア研究...

于 2012-09-04T19:40:44.943 に答える