2013-06-16 4 views
0

Я использую функцию из файла заголовка, который предварительно определен для упражнения, которое я выполняю. В основном у меня есть;Нет соответствующей функции

defineClickListener(clickAction, graph); 

clickAction является функцией я сделал и имеет прототип выше основной и граф является экземпляром класса pathfindergraph. В заголовке pathfindergraphics, который включен, он говорит;

/** 
* Function: defineClickListener 
* Usage: defineClickListener(clickFn); 
*  defineClickListener(clickFn, data); 
* ------------------------------------------ 
* Designates a function that will be called whenever the user 
* clicks the mouse in the graphics window. If a click listener 
* has been specified by the program, the event loop will invoke 
* 
*  clickFn(pt) 
* 
* or 
* 
*  clickFn(pt, data) 
* 
* depending on whether the data parameter is supplied. In either 
* case, pt is the GPoint at which the click occurred and data 
* is a parameter of any type appropriate to the application. The 
* data parameter is passed by reference, so that the click function 
* can modify the program state. 
*/ 
void defineClickListener(void (*actionFn)(const GPoint& pt)); 

template <typename ClientType> 
void defineClickListener(void (*actionFn)(const GPoint& pt, ClientType & data), ClientType & data); 

Насколько я могу видеть, я использую defineClickListener правильно, но я получаю сообщение об ошибке, что не говорит «нет функции соответствия для вызова„defineClickListener“». Не знаете, что я делаю неправильно - какие-то идеи?

+0

Попробуйте позвонить в вашу функцию с 'defineClickListener <Тип клиента> (..) ' –

+0

Каким будет тип клиента? Я попробовал PathfinderGraph, но это не сработало. –

+0

Я уже использовал addButton («Карта», mapAction, graph); который выглядит очень похожим в заголовке, таким же образом, и он отлично работает ... –

ответ

1

Это означает, что предоставленные вами аргументы не могут быть сопоставлены с параметрами функции шаблона, которую вы пытаетесь вызвать. Для этого может быть много причин. Сообщение об ошибке, сгенерированное компилятором, обычно содержит дополнительную информацию.

Я бы сделал полу-дикое предположение, что ваш clickAction является нестатической функцией-членом.

EDIT: В соответствии с дополнительной информацией, которую вы предоставили ваш clickAction объявлен

static void clickAction(PathfinderGraph *&graph) 

Это совершенно неприемлемо. Во-первых, функция обработчика должна иметь два Счетчики, первый из которых const GPoint&

static void clickAction(const GPoint& pt, PathfinderGraph *&graph) 

Во-вторых, согласно декларации шаблона тип второго параметра функции обработчика должен совпадать с типом последнего параметра defineClickListener, т.е. оба должны быть ссылками на один и тот же тип. Что такое в вашем запросе до defineClickListener. Если является указателем на PathfinderGraph, тогда вы действительно должны использовать указанное выше объявление.

Но если не является указателем (ссылка на график объект или сам граф объект), то он должен быть

static void clickAction(const GPoint& pt, PathfinderGraph &graph) 
+0

Это статическая пустота. –

+0

@ Robbie Cooper: Встречается ли подпись? То есть объявляется ли это параметрами 'const GPoint & 'и' const YourGraphType & '? – AnT

+0

Компилятор говорит, что «шаблон-кандидат игнорируется: неудачный вывод аргумента шаблона» –

Смежные вопросы