2012-11-17 45 views
2

看來boost::multi_array<T, n>要求T有一個無參數的構造函數。考慮下面的例子。無法初始化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()。當然,我可以爲我的類添加一個無參數構造函數。但是如果我有一個沒有參數的構造函數沒有意義的類呢?

有沒有簡單的方法來使用boost :: multi_array當T沒有無參數構造函數?

回答

1

它不僅是複製構造函數 - 實際上boost::multiarray的所有構造函數都將調用allocate_space(),它依次調用std::uninitialize_fill_n(base, allocated_elements_, T());。因此這裏需要一個沒有參數的構造函數。如果您仍然想使用boost::multi_array,我認爲沒有辦法繞過它。 (我指boost-1.46.0的源代碼。)

另一種可能是這樣的:你自己分配和初始化空間。然後通過地址boost::multi_array_ref。在這種情況下,你將不得不管理內存。

+1

謝謝丹琪。的確,現在看起來'multi_array_ref'可能是我最好的選擇。在進一步挖掘之後,我發現這個主題有一個[bug報告](https://svn.boost.org/trac/boost/ticket/6889)。 –

+0

建議的鏈接更改很好。分配內存分配和初始化到不同的方法是非常有意義的。 –

相關問題