我正在尝试将参数传递给作为参数传递的函数指针。
代码:
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*),以便我可以使用它们。但主函数可以是void或int argc、char**argv。所以我通过简单地使用全局变量实现了我想要实现的目标
我需要使用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");
但你不需要他们做你想做的事
@πνταῥεῖ 已经在答案中解释了原因。
有多种方法可以解决此问题,但是,让我尝试说明为什么会发生此错误。
每个函数都有一种关联的值类型。这意味着,每个函数的计算结果都是某种类型的值。这由其返回值表示。
例如:
int foo(/*whatever*/);
计算结果为整数。因此,foo(/*无论*/)
可以在任何需要int
的地方使用。例如,像 int a = b foo(/*任何东西*/)
。
Simlarly < code >浮动条(/* whatever */);计算结果为< code>float,因此< code>bar(/*whatever*/)可以在任何需要float的地方使用。例如像< code > float a = b bar(/* whatever */)。
然而,返回 void
的函数,如 void foobar(/*whatever*/),
其计算结果为 void
,并且不能在需要某种类型的值(比如整数、浮点数等)时使用。
现在开始编码。main
函数中的这一行存在问题:
int main()
{
Test2(Test(L"Hello", L"Testing")); /* Issue here */
return 0;
}
在这里,您通过了测试(L“你好”,L“测试”)
作为测试2
的参数。现在请记住,测试(/*无论*/)
的计算结果为空,
因为测试
返回空洞。
所以你在这一行做的事情就像
Test2(/*something that evaluates to a void*/);
但是,Test2
需要一个空隙 (*)(wchar_t*,wchar_t*),
它是指向返回空洞的函数的指针
,它与空洞
不同。
所以发生的事情是,编译器看到您正在传递一个void
在一个void(*)(wchar_t*,wchar_t*)
的位置,所以它正确地指示了该错误。
其他答案中提到了解决这个问题的不同方法。
你可能想拥有这样的东西
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;
}
这应该没问题。
C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {
我编写了一个代码来传递函数指针列表(按其名称)作为参数。但我有错误。你能解释为什么我在做地图时有错误吗? 错误: 34:18:错误:无法将'void(Bar::)(int, int)'转换为'std::map, void(*)(int, int) 35:18:错误:无法将“无效(foo::)(整数,整数)”转换为“标准::映射,无效(*)(整数,整型) 41:70:错误:没有用于调用“std::v
一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType
清单2.4中,向std::thread构造函数中的可调用对象,或函数传递一个参数很简单。需要注意的是,默认参数要拷贝到线程独立内存中,即使参数是引用的形式,也可以在新线程中进行访问。再来看一个例子: void f(int i, std::string const& s); std::thread t(f, 3, "hello"); 代码创建了一个调用f(3, "hello")的线程。注意,函数f需
我有我的函数,我正在那里填充,但调用这个函数后没有填充,但我知道它是在这个函数中填充的,因为我有那里的输出代码。 我像这样传递指针 为什么它不起作用?谢谢
我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函