0

私は使用してboost::multi_index_containerおり、操作を機能させようとしてmodifyいます。私の変更ルーチンは、関数内部クラスを使用して、(大まかに) 次のようになります。

void FooContainer::modifyAttribute(string key, int newValue) {
    struct ModifyFunc {
        int val;
        ModifyFunc(int val): val(val) {}
        void operator()(Foo &f) {
            foo.val = val;
        }
    };
    StorageContainer::index<keyTag>::type &idx = mContainer.get<keyTag>();
    StorageContainer::index<keyTag>::type::iterator iter = idx.find(key);
    idx.modify(iter, ModifyFunc(newValue));
}

これをコンパイルしようとすると、次のような複数ページのコンパイラ エラーが発生します (ほとんどは省略されています)。

FooContainer.cpp:##: error: no matching function for call to [...]::modify([...]&, FooContainer::modifyAttribute(string,int)::ModifyFunc)’

この呼び出しの何が問題なのですか? どうすれば機能させることができますか?

4

1 に答える 1

0

問題は、関数の内部クラスがコンパイラによってテンプレート パラメーターの有効な型名として認識されないことです。明らかではありませんが、このmulti_index_container::index<T>::type::modifyメソッドは変更パラメーターの型をテンプレート引数として使用します。これは、通常は表示されない詳細です。ただし、たとえば次の宣言を見てくださいboost/multi_index/hashed_index.hpp

template<typename Modifier>
bool modify(iterator position,Modifier mod)

簡単な修正は、ModifyFunc構造体を関数内部クラスではなくすることです。FooContainer自明ですが、メソッドではなく内部にしFooContainer::modifyAttributeます。もちろん、これはModifyFunc、複数の場所で必要になった場合に、クラスを別の場所で再利用できることも意味します。

于 2012-10-12T00:42:21.013 に答える