c++ - 构建错误 : none of the 12 overloads could convert all the argument types

标签 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);

我在构建过程中收到错误消息 尝试这些论点

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++ 和重载的新手。我究竟做错了什么?我应该/可以将什么作为第三个参数?

控制系统

最佳答案

这里有两个问题。

"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);

关于c++ - 构建错误 : none of the 12 overloads could convert all the argument types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870704/

相关文章:

c++ - 重载运算符以与 C++ 中的另一个类一起使用

C++ 奇怪的函数行为

c++ - 类模板上的运算符重载

c++ - 运算符重载与函数调用的性能

c++ - 模板转换运算符

c++ - 赋值运算符和复制构造函数

c++ - 在 #define 宏中嵌入 if 语句

c++ - 关于 C++ 中的局部和全局静态变量

c++ - 与客户共享 C++ DLL 和 H 文件

c++ - CUDA:在使用 cudaMallocPitch 分配的二维数组中查找数组索引