使用c ++ 0x Lambda表达式时调用不匹配

时间:2011-03-27 18:42:26

标签: c++ lambda c++11

这是有问题的功能:

void Molecule::initSimilarity(int depth)
{
    int m = 1;
    for (int j = 0; j < depth ; j++)
        for (int i = 0 ; i < _size ; i++)   //for any atom A
            if (!getSetMask(                //put all atoms which are equivalnt but not similar to A in their own
                                            //equivalence class
                [&](const Atom& b)->bool {return (_atoms[i]->_class == b._class) && !(isSimilar(*_atoms[i],b));},
                [&m](Atom& b){b._class = m;}     //113
                ).none()) m++;                   //114
}

输出:

  

包含在/ usr / include / c ++ / 4.5 / memory:82:0,

中的文件
             from /usr/include/boost/dynamic_bitset_fwd.hpp:15,
             from /usr/include/boost/dynamic_bitset/dynamic_bitset.hpp:36,
             from /usr/include/boost/dynamic_bitset.hpp:15,
             from DataStructures/Molecule.h:21,
             from DataStructures/Molecule.cpp:8:
     

/ usr / include / c ++ / 4.5 / functional:In   静态成员函数'静态void   的std :: _ Function_handler :: _ M_invoke(常量   std :: _ Any_data&amp;,_ ArgTypes ...)[with   _Functor = Molecule :: initSimilarity(int)::,   _ArgTypes = {Atom}]':

     

的/ usr /包括/ C ++ / 4.5 /功能:2103:6:   实例化   “的std ::功能&LT; _res(_ArgTypes   ...)&gt; :: function(_Functor,typename   的std :: enable_if≤(!   的std :: is_integral&LT; _Functor&GT; ::值),   的std ::功能&LT; _res(_ArgTypes   ...)&gt; :: _ Useless&gt; :: type)[with _Functor   = Molecule :: initSimilarity(int)::,   _Res = void,_ArgTypes = {Atom},typename std :: enable_if&lt;(!   的std :: is_integral&LT; _Functor&GT; ::值),   的std ::功能&LT; _res(_ArgTypes   ...)&gt; :: _ Useless&gt; :: type =   的std ::功能:: _无用]”

     

数据结构/ Molecule.cpp:114:5:
  从这里实例化

     

的/ usr /包括/ C ++ / 4.5 /功能:1713:9:   错误:无法匹配

     

“(分子:: initSimilarity(INT)::)   (原子)”

     

数据结构/ Molecule.cpp:113:17:   注意:候选人是:   分子:: initSimilarity(INT)::

我不知道这是怎么发生的,究竟是什么意思,我在谷歌找不到任何帮助......

被调用的函数(isSimilar()):

bool Molecule::isSimilar(const Atom &A, const Atom &B)
    {
        AtomSet S;
        for (int i = 0; i < _size; i++)
        {
            if (!_adjecancy[A._index][i]) continue; //Skip any atoms which aren't adjecant to A
            int K = findAtom([&](const Atom& b){return (_adjecancy[B._index][b._index]) && (B._class == b._class) && (!S[B._index]);});
            if (K == -1) return false;
            S.flip(K);
        }
        return true;
    }

和那个叫它的人:

int Molecule::findAtom(std::function<bool (const Atom)> property, std::function<void (Atom)> action = NULL)
{
    for (int i=0 ; i<_size ; i++)
    {
        if (property(*_atoms[i]))
        {
            if (action != NULL) action(*_atoms[i]);
            return i;
        }
    }
    return -1;
}

使用了typedef:

typedef dynamic_bitset<> AtomSet;
typedef dynamic_bitset<>::size_type atom_ind;

当然还有在错误输出中出现的函数:

AtomSet Molecule::getSetMask(std::function<bool (const Atom)> property, std::function<void (Atom)> action = NULL)
{
    dynamic_bitset<> ret(_size);
    if (property != NULL) for(int i=0; i<_size ; i++) ret.set(i, property(*_atoms[i]));
    return ret;
}

1 个答案:

答案 0 :(得分:1)

我在lambda的参数类型中看到了引用,而getSetMask所需的functor类型中没有引用。

如果你保持一致,你的错误是否仍然存在?

即。如果您想要修改Atom的操作,则需要

std::function<void (Atom&)> action