0

我正在尝试创建一个基于boost::multi_array. 我在下面给出的代码中面临两个问题。(1) 成员函数的代码col()无法编译::type’ has not been declared。我哪里错了?(2) 是否可以在类外定义成员函数data()?我的尝试给出了编译错误,因为 typedef 不可用。但是我无法在类外部定义 typedef,因为 typedef 又需要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]);
}
4

2 回答 2

2
array_type::array_view<1>::type

您在这里需要模板和类型名:)

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

关键字 template 是必需的,因为否则 < 和 > 将被视为越来越少,因为 array_type 是从属名称,因此在实例化之前不知道 array_view 是否是嵌套模板。

于 2011-09-26T18:32:14.763 回答
1

(1) 成员函数 col() 的代码无法编译,说明 ::type' 尚未声明。

array_type是依赖类型 onT并且array_type::array_view<1>::type仍然依赖于T,你需要一个typename.

(2) 是否可以在类外定义成员函数data()?

确实是这样,但是在类中定义它应该不是问题。

 template< typename T >
 typename Array2d< T >::element* Array2d< T >::data(){ ... }
于 2011-09-26T18:17:46.787 回答