C++ Функции/Перегрузки метода: беспорядок Типа данных?

Если словарь может быть соле, он может быть сохранен в поле текста/блоба также.

Просто знать о словарях, которые не могут быть солеы (иначе, которые содержат unpickable объекты).

9
задан Tom 28 October 2009 в 09:49
поделиться

7 ответов

Порядок не имеет значения. Метод для вызова выбирается путем анализа типов аргументов и сопоставления их с типами параметров. В случае отсутствия точного соответствия выбирается наиболее подходящий метод. В вашем случае это метод bool .

Вы предоставляете аргумент типа const char [7] . Согласно правилам перегрузки C ++, лучший способ здесь - позволить const char [7] распасться до const char * , а затем преобразовать его в bool с помощью стандартное преобразование. Путь с преобразованием в std :: string считается хуже, так как он будет включать определяемое пользователем преобразование из const char * в std :: string . Обычно, определяемые пользователем преобразования теряют процесс разрешения перегрузки по сравнению со стандартными преобразованиями. То же самое происходит и в вашем случае.

Если вам нужно вызвать здесь версию std :: string , укажите явную перегрузку для типа const char * и делегируйте вызов версии std :: string путем явного преобразования аргумента в тип std :: string

void Method(const char *paramater /* sic! */)
{
  Method(std::string(paramater));
}
23
ответ дан 4 December 2019 в 06:30
поделиться

Порядок не имеет значения. Проблема здесь в том, что когда вы вызываете

Method("string");

, вы передаете const char []. Это будет неявно преобразовано в bool. Вы хотите явно передать std :: string:

Method( std::string("string"));
4
ответ дан 4 December 2019 в 06:30
поделиться

Строковый литерал «строка» имеет тип const char [] , который может быть неявно преобразован в bool . Это лучший кандидат на преобразование в одну из ваших перегруженных функций, хотя он вряд ли будет наиболее полезным.

Если вы намеревались обработать строковые литералы с помощью перегрузки, принимающей std :: string ], то вам нужно добавить перегрузку, принимающую const char * , и сделать так, чтобы реализация вызвала версию std :: string .

5
ответ дан 4 December 2019 в 06:30
поделиться

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

class SomeClass
{
    public:
    ...
    template <typename T>
    void Method(T paramater);
};
2
ответ дан 4 December 2019 в 06:30
поделиться

Как уже указывал Чарльз, это происходит из-за нежелательного неявного преобразования. Если вы хотите избежать этого, используйте конструктор std :: string: Метод (std :: string ("строка")); или приведите его к std :: string:

Method(static_cast<std::string>("string"));

Однако порядок ваших объявлений не важен. Также проверьте правильность написания слова "параметр";)

1
ответ дан 4 December 2019 в 06:30
поделиться

Помимо проблемы со строкой, есть еще одна проблема. int64_t и int8_t (обычно) являются определениями типов. Поскольку typedef - это просто псевдонимы, они могут относиться к одному и тому же типу, и в этом случае перегрузка не сработает. Но в вашем случае это маловероятно. Просто хотел упомянуть об этом.

1
ответ дан 4 December 2019 в 06:30
поделиться

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

.
1
ответ дан 4 December 2019 в 06:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: