c++ 构建错误:这12个重载都不能转换所有参数类型

qpgpyjmq  于 2023-02-10  发布在  其他
关注(0)|答案(5)|浏览(242)

我在一个头文件中使用了一个重载函数,定义如下

// 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系统

x33g5p2x

x33g5p2x1#

这里有两个问题。
"MCP"具有类型char const[4],该类型衰减为char const*。这与第一个参数char*不兼容。也许您需要修复这些函数签名以接受char const*参数?
如果这些函数不是你的,并且是正确的(也就是说,它们实际上需要改变第一个参数),那么你需要传递一个可变的参数:

char mcp[] = "MCP"; // now this properly decays to char*
int res = PmdgGetVariable(mcp, 0, 0); // beware of buffer overflow issues

如果函数签名不正确,因为它们没有改变第一个参数,尽管使用了一个非常数参数,您可以求助于const_cast
另一个问题是0可以被转换成所有这些指针类型,编译器无法决定选择哪一个函数,你需要通过强制类型转换来明确类型,或者使用一个类型正确的变量。

PmdgGetVariable(mcp, 0, static_cast<int*>(0));

我觉得很奇怪,这个函数可以用一个空指针调用,并且有所有的重载。也许它需要一个非空指针?

int x = 0;
int res = PmdgGetVariable(mcp, 0, &x);
bd1hkmkf

bd1hkmkf2#

问题出在第一个参数上,字符常量(在示例中为"MCP")的类型为const char*,并且没有重载将const char*作为其第一个参数。

k4ymrczo

k4ymrczo3#

我会说这是因为你的调用是不明确的,因为你传递了一个nullptr作为你的第三个参数,没有类型信息,显示的任何重载都可能是正确的。
要修复,请尝试以下操作:

bool fParam = true;
int res = PmdgGetVariable("MCP", 0, &fParam );
enxuqcxy

enxuqcxy4#

所有的重载都有一个指针作为第三个参数&所以,如果你不传递一个指针,编译器就会产生一个错误。
你做错了什么--不知道。这个函数应该做什么?它应该返回一个结果到一个通过引用传递的调用者变量中吗?我猜是这样的,因为第三个param. is命名为'result',所以:

bool myResult;
..
int res = PmdgGetVariable("MCP", 0, &myResult);

..或其他5种重载结果类型中的任何一种。

mrphzbgm

mrphzbgm5#

因为当你写:

PmdgGetVariable("MCP", 0, 0);

看看这一行,知道有许多可能的这样的函数,你怎么知道你是否用第三个参数bool*?short*?int*?来引用PmdgGetVariable。当你指定文字'0'时,这个文字可以引用这些类型中的任何一个

相关问题