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 回答