нет совпадения для вызова при использовании лямбда-выражений c ++ 0x - PullRequest
2 голосов
/ 27 марта 2011

Это проблематичная функция:

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 / функционал: в статической функции-члене 'static void std :: _ Function_handler :: _ M_invoke (const std :: _ Any_data &, _ArgTypes ...) [with _Functor =Molecule :: initSogeneity (int) ::, _ArgTypes = {Atom}] ':

/ usr / include / c ++ / 4.5 / functions: 2103: 6: создается из' std :: function <_Res (_ArgTypes)...)> :: function (_Functor, typename std :: enable_if <(! std :: is_integral <_Functor> :: value), std :: function <_Res (_ArgTypes ...)> :: _ Бесполезно> ::type) [with _Functor = Molecule :: initSimility (int) ::, _Res = void, _ArgTypes = {Atom}, имя типа std :: enable_if <(! std :: is_integral <_Functor> :: value), std :: function<_Res (_ArgTypes ...)> :: _ Бесполезно> :: type = std :: function :: _ Бесполезно] '

DataStructures / Molecule.cpp: 114: 5:
создан здесь

/ usr / include / c ++ / 4.5 / function: 1713: 9: ошибка: нет соответствия длявызов

'(Molecule :: initS Similarity (int): :) (Atom)'

DataStructures / Molecule.cpp: 113: 17: примечание: кандидатом является: Molecule :: initS Similarity (int) ::

Понятия не имею, как это происходит и что именно это означает, и я тоже не смог найти никакой помощи в Google ...

Вызванная функция (isS Similar ()):

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;
}

использовал typedefs:

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 Ответ

1 голос
/ 27 марта 2011

Я вижу ссылки в типе аргумента лямбды, и нет ссылок в типах функторов, необходимых для getSetMask.

Сохраняется ли ваша ошибка, если вы делаете их непротиворечивыми?

т.е.если вы хотите, чтобы действие изменило Atom, вам нужно

std::function<void (Atom&)> action
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...