我在一个头文件中使用了一个重载函数,定义如下
// indexed variables: todo overloads
extern int PmdgGetVariable(char *variableName, int index, bool* result);
extern int PmdgGetVariable(char *variableName, int index, short* result);
extern int PmdgGetVariable(char *variableName, int index, unsigned short* result);
extern int PmdgGetVariable(char *variableName, int index, int* result);
extern int PmdgGetVariable(char *variableName, int index, unsigned int* result);
extern int PmdgGetVariable(char *variableName, int index, float* result);
尝试这些参数时,生成过程出错
int res = PmdgGetVariable("MCP", 0, 0);
错误是
main.cpp(80): error C2665: 'PmdgGetVariable' : none of the 12 overloads could convert all the argument types
1> c:\users\roar\documents\visual studio 2010\projects\iocpclient_ngx v0.3\PmdgSiocConnector.h(27): could be 'int PmdgGetVariable(char *,int,bool *)'
1> c:\users\roar\documents\visual studio 2010\projects\iocpclient_ngx v0.3\PmdgSiocConnector.h(28): or 'int PmdgGetVariable(char *,int,short *)'
1> c:\users\roar\documents\visual studio 2010\projects\iocpclient_ngx v0.3\PmdgSiocConnector.h(29): or 'int PmdgGetVariable(char *,int,unsigned short *)'
1> c:\users\roar\documents\visual studio 2010\projects\iocpclient_ngx v0.3\PmdgSiocConnector.h(30): or 'int PmdgGetVariable(char *,int,int *)'
1> c:\users\roar\documents\visual studio 2010\projects\iocpclient_ngx v0.3\PmdgSiocConnector.h(31): or 'int PmdgGetVariable(char *,int,unsigned int *)'
1> c:\users\roar\documents\visual studio 2010\projects\iocpclient_ngx v0.3\PmdgSiocConnector.h(32): or 'int PmdgGetVariable(char *,int,float *)'
1> while trying to match the argument list '(const char [4], int, int)'
我是C++和重载的新手。我做错了什么?我应该/可以用什么作为第三个参数?
rgs系统
5条答案
按热度按时间x33g5p2x1#
这里有两个问题。
"MCP"
具有类型char const[4]
,该类型衰减为char const*
。这与第一个参数char*
不兼容。也许您需要修复这些函数签名以接受char const*
参数?如果这些函数不是你的,并且是正确的(也就是说,它们实际上需要改变第一个参数),那么你需要传递一个可变的参数:
如果函数签名不正确,因为它们没有改变第一个参数,尽管使用了一个非常数参数,您可以求助于
const_cast
。另一个问题是
0
可以被转换成所有这些指针类型,编译器无法决定选择哪一个函数,你需要通过强制类型转换来明确类型,或者使用一个类型正确的变量。我觉得很奇怪,这个函数可以用一个空指针调用,并且有所有的重载。也许它需要一个非空指针?
bd1hkmkf2#
问题出在第一个参数上,字符常量(在示例中为
"MCP"
)的类型为const char*
,并且没有重载将const char*
作为其第一个参数。k4ymrczo3#
我会说这是因为你的调用是不明确的,因为你传递了一个
nullptr
作为你的第三个参数,没有类型信息,显示的任何重载都可能是正确的。要修复,请尝试以下操作:
enxuqcxy4#
所有的重载都有一个指针作为第三个参数&所以,如果你不传递一个指针,编译器就会产生一个错误。
你做错了什么--不知道。这个函数应该做什么?它应该返回一个结果到一个通过引用传递的调用者变量中吗?我猜是这样的,因为第三个param. is命名为'result',所以:
..或其他5种重载结果类型中的任何一种。
mrphzbgm5#
因为当你写:
看看这一行,知道有许多可能的这样的函数,你怎么知道你是否用第三个参数bool*?short*?int*?来引用PmdgGetVariable。当你指定文字'0'时,这个文字可以引用这些类型中的任何一个