2

引数のないコンストラクターがboost::multi_array<T, n>必要なようです。T次の例を考えてみましょう。

#include <boost/multi_array.hpp>

class ConstructorHasArguments {
    ConstructorHasArguments(int arg) {};
}

int main() {
    boost::multi_array<ConstructorHasArguments, 1> foo;
    return 0;
}

これにより、コンパイル エラーが発生します。

no matching function for call to ‘ConstructorHasArguments::ConstructorHasArguments()

問題は、コピー コンストラクターがコピーboost::multi_array<T,n>にスペースを割り当てようとすると、 を呼び出そうとすることT()です。もちろん、引数のないコンストラクターをクラスに追加することもできます。しかし、引数のないコンストラクターが意味をなさないクラスがある場合はどうなるでしょうか?

T に引数のないコンストラクタがない場合、boost::multi_array を使用する簡単な方法はありますか?

4

1 に答える 1

1

これはコピー コンストラクターだけではありません。実際には、すべてのコンストラクターboost::multiarrayが呼び出しallocate_space()、次に呼び出しますstd::uninitialize_fill_n(base, allocated_elements_, T());。したがって、ここでは引数のないコンストラクターが必要です。それでも使用したい場合は、バイパスする方法はないと思いますboost::multi_array。(のソースコードを参照していますboost-1.46.0。)

別の方法は次のようになります。自分でスペースを割り当てて初期化します。次に、アドレスを に渡しますboost::multi_array_ref。この場合、メモリを管理する必要があります。

于 2012-11-18T10:14:28.393 に答える