2012-09-29 70 views
0

据说如果我们想更有效地使用multi_array,我们最好使用multi_array构建器。然而,我对模板和提升都很新,我试图从书中复制一些代码。它看起来像这样:编译boost :: multi_array构建器错误

class multi_builder : boost::noncopyable  
{ 
public: 
    typedef boost::multi_array<T,N> array_type; 
    typedef boost::shared_ptr<array_type > type;  
private: 
    boost::any ext; 
public: 
    multi_builder() : ext(boost::extents){} 
    ~multi_builder(){} 
    template<std::size_t n> 
    void dim(std::size_t x) 
    { 
     BOOST_STATIC_ASSERT(n >= 0 && n < N); 
     ext = boost::any_cast<boost::detail::multi_array::extent_gen<n> >(ext) [x]; 
    } 
    boost::type create(void) 
    { 
     return boost::type<array_type>(new array_type(boost::any_cast<boost::detail::multi_array::extent_gen<N> >(ext))); 
    } 
}; 

然而,当我试图在这样的代码使用它:

multi_builder<int,2> builder; 
builder.dim<0>(2); 
builder.dim<1>(2); 
BOOST_AUTO(mp,builder.create()); 
for(int i = 0,v = 0; i < 2; ++i) 
    for(int j = 0; j < 2; ++j) 
     (*mp)[i][j] = v++; 

编译器生成以下错误:

error:invalid use of template-name 'boost::type' without an argument list 
error:'class multi_builder<int, 2u>' has no member named 'create'. 
error:invalid type in declaration before '=' token 
error:'class multi_builder<int, 2u>' has no member named 'create' 
error:invalid type argument of 'unary *' 

有人能告诉我如何解决这些错误?

回答

0

从外观上看,返回类型create()缺少模板参数列表。我没有使用这个Boost组件,但是基于如何返回值,它应该看起来像这样:

boost::type<array_type> create(void) 
+0

感谢您的回复。但是,它不起作用。在'* mp''和'没有匹配的函数调用'boost :: type >>时,我仍然得到2个错误,例如'不匹配'operator *' :: type(boost :: multi_array > *)''候选是:boost :: type > :: type () – user957121