我正在尝试基于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]);
}
答案 0 :(得分:2)
array_type::array_view<1>::type
这里需要模板和typename:)
typename array_type::template array_view<1>::type
^^^^^^^^ ^^^^^^^^
关键字模板是必需的,因为否则&lt;和&gt;将被视为越来越大,因为array_type是一个依赖名称,因此在实例化之前,不知道array_view是否是嵌套模板。
答案 1 :(得分:1)
(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(){ ... }