0

我正在使用为我正在做的练习预定义的头文件中的函数。我主要有;

defineClickListener(clickAction, graph);

clickAction 是我制作的一个函数,在 main 上方有一个原型,而 graph 是 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'的匹配函数”。不知道我做错了什么 - 有什么想法吗?

4

1 回答 1

1

这意味着您提供的参数无法与您尝试调用的模板函数的参数匹配。这可能有很多原因。编译器生成的错误消息通常包括附加信息。

我会做一个半疯狂的猜测,你clickAction是一个非静态成员函数。

编辑:根据您提供的附加信息,您clickAction的声明为

static void clickAction(PathfinderGraph *&graph)

这是完全不能接受的。首先,处理函数必须有两个参数,第一个是const GPoint&

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

其次,根据模板声明,处理函数的第二个参数的类型必须与 的最后一个参数的类型相匹配defineClickListener,即两者必须是对同一类型的引用。你graph打电话给defineClickListener. 如果graph是指向 的指针PathfinderGraph,那么您确实应该使用上述声明。

但是如果graph不是指针(对图形对象或图形对象本身的引用),那么它应该是

static void clickAction(const GPoint& pt, PathfinderGraph &graph)
于 2013-06-16T17:13:53.717 回答