构建错误:12个重载中没有一个可以转换所有参数类型

时间:2012-03-26 10:44:03

标签: 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 ++和重载新手。我究竟做错了什么?作为第三个论点,我应该/我能拥有什么?

RGS

5 个答案:

答案 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”时,该文字可以引用任何这些类型