超载功能没有上下文类型信息

overloaded function with no contextual type information

本文关键字:类型 信息 上下文 功能 超载      更新时间:2023-10-16
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; 
void cb(int x)
{
    std::cout <<"print inside integer callback : " << x << "n" ;    
}
void cb(float x)
{
    std::cout <<"print inside float callback :" << x <<  "n" ;
}
void cb(std::string& x)
{
    std::cout <<"print inside string callback : " << x << "n" ;
}
int main()
{
void(*CallbackInt)(void*);
void(*CallbackFloat)(void*);
void(*CallbackString)(void*);
CallbackInt=(void *)cb;
CallbackInt(5);
CallbackFloat=(void *)cb;
CallbackFloat(6.3);
CallbackString=(void *)cb;
CallbackString("John");
return 0;
}

上面是我的代码,它具有三个函数,我想创建三个回调,这些回调将根据其参数调用过载函数。Callbackint用于调用以INT为参数的CB函数,并类似地休息两个。

但是,当使用它进行编译时,我的错误如下。

 function_ptr.cpp: In function ‘int main()’:
 function_ptr.cpp:29:21: error: overloaded function with no contextual type information
 CallbackInt=(void *)cb;
                 ^~
 function_ptr.cpp:30:14: error: invalid conversion from ‘int’ to ‘void*’ [-fpermissive]
 CallbackInt(5);
          ^
 function_ptr.cpp:32:23: error: overloaded function with no contextual type information
 CallbackFloat=(void *)cb;
                   ^~
 function_ptr.cpp:33:18: error: cannot convert ‘double’ to ‘void*’ in argument passing
 CallbackFloat(6.3);
              ^
 function_ptr.cpp:35:24: error: overloaded function with no contextual type information
 CallbackString=(void *)cb;
                    ^~
 function_ptr.cpp:36:24: error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]
 CallbackString("John");

1)编译器不知道,选择哪种cb的超载。
2)即使确实知道,它也不会从void*转换为void(*)(int),而没有任何明确的转换。

但是,如果您给出足够的信息,它可以推断出来:

void cb(int x)
{
    std::cout <<"print inside integer callback : " << x << "n" ;
}
void cb(float x)
{
    std::cout <<"print inside float callback :" << x <<  "n" ;
}
void cb(const std::string& x)
{
    std::cout <<"print inside string callback : " << x << "n" ;
}
int main()
{
    void(*CallbackInt)(int);
    void(*CallbackFloat)(float);
    void(*CallbackString)(const std::string&);
    CallbackInt = cb;
    CallbackInt(5);
    CallbackFloat = cb;
    CallbackFloat(6.3);
    CallbackString = cb;
    CallbackString("John");
    return 0;
}

我知道这是一个旧帖子,但是我最近遇到了这个错误,我的问题是我没有声明我设置了函数结果的变量。不确定为什么这是一个错误,但希望这对某人有所帮助。

对于第一个错误,请使用静态铸造来指定所需的过载,例如此处

在其余的情况下,您不能施放一个int或浮标,以使*有意义地虚空。不知道您想在这里做什么。

CallbackInt可能应采用int参数...