2d массив из boost :: multi_array - не может скомпилировать - PullRequest
0 голосов
/ 26 сентября 2011

Я пытаюсь создать 2d класс массива на основе boost::multi_array.Я сталкиваюсь с двумя проблемами в коде, приведенном ниже.(1) Код для функции-члена col() не компилируется, говоря, что ::type’ has not been declared.Куда я иду не так?(2) Можно ли определить функцию-член data() вне класса?Моя попытка дает ошибку компиляции, так как typedefs не доступны.Но я не могу определить typedefs вне класса, потому что typedefs в свою очередь требует тип T, который доступен только внутри класса шаблонаСпасибо.

#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 ]

2 голосов
/ 26 сентября 2011
array_type::array_view<1>::type

Вам нужен шаблон и имя типа:)

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

Ключевое слово template является обязательным, потому что в противном случае <и> будут обрабатываться как все меньше и больше, поскольку array_type является зависимым именем, и, следовательно, является ли array_view вложенным шаблоном или нет, неизвестно до момента его создания.

1 голос
/ 26 сентября 2011

(1) Код для функции-члена col () не компилируется, говоря, что :: type ’не был объявлен.

array_type является зависимым типом для T, а array_type::array_view<1>::type все еще зависит от T, вам необходим typename.

(2) Можно ли определить функцию-член data () вне класса?

Конечно, но это не должно быть проблемой для его определения внутри класса.

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