use*_*615 3 c++ operator-overloading
我使用一个重载函数,在我的一个头文件中定义如下
// 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);
Run Code Online (Sandbox Code Playgroud)
尝试这些参数时,我从构建过程中得到一个错误
int res = PmdgGetVariable("MCP", 0, 0);
Run Code Online (Sandbox Code Playgroud)
错误是
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)'
Run Code Online (Sandbox Code Playgroud)
我是C++和重载的新手.我究竟做错了什么?作为第三个论点,我应该/可以拥有什么?
RGS
这里有两个问题.
"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
Run Code Online (Sandbox Code Playgroud)
如果函数签名不正确,因为它们不会更改第一个参数,尽管采用非const参数,您可以求助const_cast.
另一个问题是0可以转换为所有这些指针类型.编译器无法决定选择哪一个函数.您需要明确表示具有强制类型的类型,或使用具有正确类型的变量.
PmdgGetVariable(mcp, 0, static_cast<int*>(0));
Run Code Online (Sandbox Code Playgroud)
我觉得奇怪的是,可以使用空指针调用该函数并具有所有这些重载.也许它需要一个非空指针?
int x = 0;
int res = PmdgGetVariable(mcp, 0, &x);
Run Code Online (Sandbox Code Playgroud)