0

multi_array をより効率的に使いたい場合は、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 *'

誰かがエラーを修正する方法を教えてもらえますか?

4

1 に答える 1

0

見た目から、 の戻り値の型にcreate()はテンプレート引数リストがありません。私はこの Boost コンポーネントを使用していませんが、値がどのように返されるかに基づいて、おそらく次のようになります。

boost::type<array_type> create(void)
于 2012-09-29T14:28:46.147 に答える