проблема с функцией повышения - PullRequest
0 голосов
/ 14 марта 2011

Я не могу понять, что не так с кодом здесь, поэтому я надеялся, что кто-то может мне помочь:

В заголовочном файле я определяю следующие функции

void GenLiveVar(const instr_ptr instr, std::vector<ResultBase*> &list);
void KillLiveVar(const instr_ptr instr, std::vector<ResultBase*> &list);

В файле заголовка класса я определяю этот typedef:

typedef boost::function<void(instr_ptr, std::vector<ResultBase*>) > GenFunction;

внутри класса, у меня есть два экземпляра GenFunction

GenFunction Gen;
GenFunction Kill;

И я назначаю их следующим образом

void DataFlowSolver::SetGenFunction(GenFunction &func)
{
    Gen = func;
}

void DataFlowSolver::SetKillFunction(GenFunction &func)
{
    Kill = func;
}

позже в моей программе я назначаю gen следующим образом:

blockSolver.SetGenFunction(GenLiveVar);

где GenLiveVar - функция, упомянутая ранее, а blockSolver - экземпляр класса, содержащего Gen / Kill.Внутри blockSolver я делаю следующее:

std::vector<ResultBase*> genList;
Gen(currentBlock->GetInstrPtr(i), &genList);

, а GetInstrPtr определяется как const instr_ptr GetInstrPtr(int index);

. Он генерирует следующую ошибку (извините за длину)

    no match for call to '(GenFunction) (const instr_ptr, std::vector<ResultBase*, std::allocator<ResultBase*> >*)'
    /nfs/ug/homes-2/r/rileyjon/ece540/Final/boost/function/function_template.hpp:1007: 
note: candidates are: typename boost::function2<R, T1, T2>::result_type boost::function2<R, T1, T2>::operator()(T0, T1) const [with R = void, T0 = boost::shared_ptr<Instruction>, 
T1 = std::vector<ResultBase*, std::allocator<ResultBase*> >

]

Я действительно не понимаю, почему это проблема: типы, безусловно, одинаковы.Некоторая помощь будет оценена.Спасибо

1 Ответ

4 голосов
/ 14 марта 2011

Типы определенно не одинаковы.

Передаваемый вами аргумент имеет тип std::vector<ResultBase*>* (указатель):

Gen(currentBlock->GetInstrPtr(i), &genList);
                                  ^

Соответствующийпараметр имеет тип std::vector<ResultBase*> (значение):

boost::function<void(instr_ptr, std::vector<ResultBase*>)>
                                                       ^

Также обратите внимание на несоответствие типов параметров между boost::function, который принимает второй аргумент по значению, и двумя функциями, которые вы ему назначаете, которые принимают свои вторые аргументы по ссылке.Это, вероятно, не даст вам ожидаемого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...