2011-09-26 48 views
0

我想根據boost::multi_array創建一個2d數組類。我在下面給出的代碼中面臨兩個問題。 (1)成員函數col()的代碼不會編譯爲::type’ has not been declared。我哪裏錯了? (2)是否可以在課堂外定義成員函數data()?由於typedefs不可用,因此我嘗試給出編譯錯誤。但是我無法在類之外定義類型定義,因爲類型定義反過來需要類型T,該類型僅在模板類中可用。謝謝。來自boost :: multi_array的2d數組 - 無法編譯

#include <boost/multi_array.hpp> 
#include <algorithm> 

template <class T> 
class Array2d{ 
public: 
    typedef typename boost::multi_array<T,2> array_type; 
    typedef typename array_type::element element; 
    typedef boost::multi_array_types::index_range range; 

    //is it possible to define this function outside the class? 
    Array2d(uint rows, uint cols); 
    element * data(){return array.data();} 

    //this function does not compile 
    template<class Itr> 
    void col(int x, Itr itr){ 
     //copies column x to the given container - the line below DOES NOT COMPILE 
     array_type::array_view<1>::type myview = array[boost::indices[range()][x]]; 
     std::copy(myview.begin(),myview.end(),itr); 
    } 

private: 
    array_type array; 

    uint rows; 
    uint cols; 
}; 

template <class T> 
Array2d<T>::Array2d(uint _rows, uint _cols):rows(_rows),cols(_cols){ 
    array.resize(boost::extents[rows][cols]); 
} 

回答

2
array_type::array_view<1>::type 

你需要模板類型名稱在這裏:)

typename array_type::template array_view<1>::type 
^^^^^^^^    ^^^^^^^^ 

關鍵字模板是必需的,因爲否則<而且由於ARRAY_TYPE是一個從屬名稱>將被視爲越來越更大,因此在實例化之前,array_view是否爲嵌套模板是未知的。

+0

我已經想出了編譯器錯誤信息和K-ballo輸入的幫助。但爲什麼'模板'的要求? – suresh

+0

@suresh:查看我的編輯 –

+1

@suresh:有關更多詳細信息,請參閱此FAQ:[模板,'.template'和':: template'語法是什麼?](http:// www。 comeaucomputing.com/techtalk/templates/#templateprefix) – ildjarn

1

(1)的成員函數COL的代碼()不編譯說::類型」尚未聲明。

array_typeT一個依賴型和array_type::array_view<1>::type仍然依賴T,你需要一個typename

(2)是否可以在類之外定義成員函數data()?

它確實是,但它不應該是一個問題,它不應該是在類內定義的問題。

template< typename T > 
typename Array2d<T>::element* Array2d<T>::data(){ ... } 
+0

謝謝。我將問題行修改爲'typename array_type :: template array_view <1> :: type myview = array [boost :: indices [range()] [x]];'並編譯它。但是,那麼爲什麼明確提到'template'是必需的?編譯器提示它。 (gcc 4.4.3) – suresh

+1

@suresh:因爲是依賴模板;依賴類型需要'typename',依賴模板需要'template'關鍵字。 –

相關問題