4

次のような状況があります。

Class Bar {
...
}

template <class T>
class Foo {
public:
  ...
  Foo(Foo<Bar> bar) {
    ...
  }
  ...
}

したがって、クラス Foo のコンストラクターの 1 つは、Bar によってパラメーター化されたクラス Foo の要素を取ることができます。これは、Bar によってパラメーター化されたクラス Foo の何かをインスタンス化するまでは問題ありません。このコンストラクターは、私が望むものではないコピー コンストラクターとして解釈されます。コピーコンストラクターに干渉することなく、そのような要素をコンストラクターに持たせるにはどうすればよいか疑問に思っています。たとえば、私はこれを行うことができます:

template <class T>
class Foo {
public:
  ...
  Foo(Foo<Bar> bar, int unused) {
    ...
  }
  ...
}

コンストラクターがコピー コンストラクターと競合しないため、問題なく動作します。この問題に対処する標準的な方法はありますか?

4

2 に答える 2

0

コピーコンストラクターは次の4つの形式のいずれかに従う必要があるため、これは実際には有効なコピーコンストラクターではありません。

MyClass( const MyClass& other );
MyClass( MyClass& other );
MyClass( volatile const MyClass& other );
MyClass( volatile MyClass& other );

すべてが期待どおりに機能するようにするには、パラメーターをポインターとして渡します。

Foo(Foo<Bar>* bar) {
    // Logic
}

値で渡すと、ロジックがコピーコンストラクターを模倣している場合、無限ループを非常にうまく作成できます。

于 2012-10-03T18:27:02.083 に答える