我正在尝试将参数传递给作为参数传递的函数指针。
代码:
void Test(wchar_t* a, wchar_t* b)
{
// ...
}
void Test2(void(*Func)(wchar_t*, wchar_t*))
{
// ...
}
int main()
{
Test2(Test(L"Hello", L"Testing"));
return 0;
}
我收到此错误:
类型的参数" void"与" void(*)(wchar_t *,wchar_t *)"
类型的参数不兼容
如何解决这个问题以实现我想要实现的目标?
编辑:抱歉不清楚。我实际上要完成的是将一个函数注入子进程并传递两个参数(wchar_t *,wchar_t *),以便我可以使用它们。但是main函数可以是void或int argc,char ** argv。所以我通过简单地使用全局变量
完成了我想要实现的目标答案 0 :(得分:6)
你可能想要像
这样的东西void Test2(void(*Func)(wchar_t*, wchar_t*),wchar_t* x, wchar_t* y)
{
(*Func)(x,y);
}
int main()
{
Test2(Test,L"Hello", L"Testing");
return 0;
}
代替。
至于你的评论
如何在C ++中使用模板执行此操作?
我能想到
template<typename Param>
void Test2(void(*Func)(Param, Param), Param x, Param y) {
(*Func)(x,y);
}
void Test(wchar_t* a, wchar_t* b);
int main() {
Test2(Test,L"Hello", L"Testing");
return 0;
}
这应该可以正常工作。
答案 1 :(得分:0)
有多种方法可以解决这个问题,但是,让我试着说明为什么会出现这种错误。
每个函数都有一种与之关联的值。这意味着,每个函数都会计算出某种类型的值。这由其返回值表示。
例如:
int foo(/*whatever*/);
评估为int。因此,foo(/*whatever*/)
可用于预期int
的任何位置。例如int a = b + foo(/*whatever*/)
。
Simlarly float bar(/*whatever*/);
评估为float
,因此bar(/*whatever*/)
可用于预期浮点数的任何位置。例如float a = b + bar(/*whatever*/)
。
返回void
的函数,例如void foobar(/*whatever*/)
,评估为void
,而不能用于某种类型的值(例如int,float,等)预计。
现在来代码。 main
函数中的这一行有以下问题:
int main()
{
Test2(Test(L"Hello", L"Testing")); /* Issue here */
return 0;
}
在这里,您将Test(L"Hello", L"Testing")
作为参数传递给Test2
。现在请记住,Test(/*whatever*/)
评估为void
因为Test
返回空格。
所以你在那一行做的事情就像是
Test2(/*something that evaluates to a void*/);
但是,Test2
取消void (*)(wchar_t*, wchar_t*)
,pointer to a function that returns void
,与void
不同。
所发生的事情是,编译器看到你在void
所在的地方传递了void (*) (wchar_t*, wchar_t*)
,因此它正确地表明了错误。
在其他答案中可以提出不同的方法来解决这个问题。
答案 2 :(得分:0)
我是否需要使用C ++模板?
当然,您可以使用C ++模板执行此操作:
#include<utility>
// ...
template<typename F, typename... A>
void Test2(F &&f, A&&... a)
{
std::forward<F>(f)(std::forward<A>(a)...);
// ...
}
// ...
Test2(Test, L"Hello", L"Testing");
但你不需要他们做你想做的事 @πάνταῥεῖ已在其答案中解释了原因。