当前位置: 首页 > 知识库问答 >
问题:

向函数指针传递参数

赵星华
2023-03-14

我正在尝试将参数传递给作为参数传递的函数指针。

代码:

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。所以我通过简单地使用全局变量实现了我想要实现的目标

共有3个答案

壤驷棋
2023-03-14

我需要使用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");

但你不需要他们做你想做的事
@πνταῥεῖ 已经在答案中解释了原因。

戚俊人
2023-03-14

有多种方法可以解决此问题,但是,让我尝试说明为什么会发生此错误。

每个函数都有一种关联的值类型。这意味着,每个函数的计算结果都是某种类型的值。这由其返回值表示。

例如:

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*)的位置,所以它正确地指示了该错误。

其他答案中提到了解决这个问题的不同方法

闻人昕
2023-03-14

你可能想拥有这样的东西

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 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函