Перегрузка, строки и параметры по умолчанию - PullRequest
0 голосов
/ 19 февраля 2009

Рефакторинг старого кода, я наткнулся на эту функцию (псевдокод):

int getMessage( char * buffer, int size = 300 );

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

int getMessage( std::string & buffer );

Пока все хорошо. Но когда я пытаюсь вызвать функцию со строкой:

std::string buffer;
int rc = getMessage( buffer );

Я получаю эту ошибку:

cannot convert 'std::string' to 'char*' for argument '1' to 'int getMessage(char*, int)'

Очевидно, что компилятор (GCC 4.1.2) изо всех сил пытается преобразовать std :: string в char *, чтобы удовлетворить список параметров первой функции (используя значение по умолчанию, чтобы удовлетворить второй параметр), сдается, но не попробуй вторую функцию ...

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

Ответы [ 5 ]

3 голосов
/ 19 февраля 2009

На моем GCC 4.3.2 все работает как положено, может, вы неправильно написали название перегрузки? Нет преобразования из std :: string в char *, поэтому у компилятора не должно возникнуть проблем с выбором правильной перегрузки.

$ cat test.cpp
#include <string>
#include <stdio.h>

int getMessage( char * buffer, int size = 300 )
{
printf("1\n");
return 1;
}

int getMessage( std::string & buffer )
{
printf("2\n");
return 2;
}

int main()
{
std::string buffer;
buffer = "Hello";
int rc = getMessage( buffer );
}

$ g++ test.cpp -Wall -pedantic
test.cpp: In function ‘int main()’:
test.cpp:20: warning: unused variable ‘rc’
$ ./a.out 
2
$ $ g++ -v 2>&1|tail -n1
gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12) 
$
1 голос
/ 19 февраля 2009

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

Итак, я придумал функцию, использующую std :: string ...

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

Извините за беспокойство. Я был идиотом. Я надеюсь, что это не стало привычкой. ; -)

1 голос
/ 19 февраля 2009

У вас есть объявление `int getMessage (std :: string & buffer); ' в рамках? Вы попали в эту ошибку, потому что соответствующая функция не найдена.

1 голос
/ 19 февраля 2009

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

1 голос
/ 19 февраля 2009

Хммм. Не существует неявного преобразования из std :: string в char *, так что это не может быть вашей проблемой. Вы уверены, что ваша новая функция видна на сайте вызовов?

Вы сказали, что это псевдокод. Вы что-то упускаете? Эти шаблонные функции или функции-члены? Пожалуйста, опубликуйте больше кода или попробуйте свести его к небольшому тестовому кейсу.

...