ошибка сборки: ни одна из 12 перегрузок не может преобразовать все типы аргументов - PullRequest
3 голосов
/ 26 марта 2012

Я использую функцию перегрузки, которая определена следующим образом в одном из моих заголовочных файлов

// 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 ]

8 голосов
/ 26 марта 2012

Здесь есть две проблемы.

"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);
1 голос
/ 26 марта 2012

Проблема с первым параметром.Символьные литералы ("MCP" в вашем примере) имеют тип const char*, и в качестве первого аргумента отсутствует перегрузка, в которой const char*.

0 голосов
/ 24 декабря 2013

Потому что, когда вы пишете:

    PmdgGetVariable("MCP", 0, 0);

Просто взглянув на эту строку и зная, что существует множество возможных таких функций, как вы узнаете, что вы ссылаетесь на PmdgGetVariable с третьим параметром bool *?короткая*?INT * ?.Когда вы указываете литерал '0', этот литерал может ссылаться на любой из этих типов

0 голосов
/ 26 марта 2012

Все ваши перегрузки имеют указатель в качестве третьего параметра, поэтому, если вы не передадите указатель, компилятор выдаст ошибку.

Что ты делаешь неправильно - не знаю. Что эта функция должна делать? Предполагается ли возвращать результат в вызывающую переменную, переданную по ссылке? Я так думаю, потому что третий параметр. это имена 'результат', поэтому:

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

.. или любые другие 5 перегруженных типов результатов.

0 голосов
/ 26 марта 2012

Я бы сказал, что это потому, что ваш вызов неоднозначен. Поскольку вы передаете nullptr в качестве третьего параметра без информации о типе, любая из показанных перегрузок потенциально может быть корректной.

Чтобы исправить, попробуйте что-то вроде:

bool fParam = true;
int res = PmdgGetVariable("MCP", 0, &fParam );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...