我使用了一个重载函数,该函数在我的一个头文件
中定义如下// 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
答案 0 :(得分:8)
这里有两个问题。
"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参数,您可以使用const_cast
。
另一个问题是0
可以转换为所有这些指针类型。编译器无法决定选择哪一个函数。您需要明确表示具有强制转换的类型,或使用具有正确类型的变量。
PmdgGetVariable(mcp, 0, static_cast<int*>(0));
我觉得很奇怪,可以使用空指针调用该函数并具有所有这些重载。也许它需要一个非空指针?
int x = 0;
int res = PmdgGetVariable(mcp, 0, &x);
答案 1 :(得分:1)
问题在于第一个参数。字符文字(示例中为"MCP"
)的类型为const char*
,并且没有以const char*
作为其第一个参数的重载。
答案 2 :(得分:0)
我说这是因为你的电话不明确。由于您传递nullptr
作为第三个参数而没有类型信息,因此显示的任何重载都可能是正确的。
要修复,请尝试以下方法:
bool fParam = true;
int res = PmdgGetVariable("MCP", 0, &fParam );
答案 3 :(得分:0)
所有重载都有一个指针作为第三个参数&amp;所以,如果你没有传递指针,编译器将产生错误。
你做错了什么 - 不知道。这个函数应该做什么?是否应该将结果返回到通过引用传递的调用者var?我猜是因为第三个参数。是名称'结果',所以:
bool myResult;
..
int res = PmdgGetVariable("MCP", 0, &myResult);
..或任何其他5种重载结果类型。
答案 4 :(得分:0)
因为你写的时候:
PmdgGetVariable("MCP", 0, 0);
只看这一行并知道有很多可能的这样的函数,你怎么知道你是用第三个参数bool *引用PmdgGetVariable?短*? INT *?当您指定文字“0”时,该文字可以引用任何这些类型