Если словарь может быть соле, он может быть сохранен в поле текста/блоба также.
Просто знать о словарях, которые не могут быть солеы (иначе, которые содержат unpickable объекты).
Порядок не имеет значения. Метод для вызова выбирается путем анализа типов аргументов и сопоставления их с типами параметров. В случае отсутствия точного соответствия выбирается наиболее подходящий метод. В вашем случае это метод 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));
}
Порядок не имеет значения. Проблема здесь в том, что когда вы вызываете
Method("string");
, вы передаете const char []. Это будет неявно преобразовано в bool. Вы хотите явно передать std :: string:
Method( std::string("string"));
Строковый литерал «строка»
имеет тип const char []
, который может быть неявно преобразован в bool
. Это лучший кандидат на преобразование в одну из ваших перегруженных функций, хотя он вряд ли будет наиболее полезным.
Если вы намеревались обработать строковые литералы с помощью перегрузки, принимающей std :: string
], то вам нужно добавить перегрузку, принимающую const char *
, и сделать так, чтобы реализация вызвала версию std :: string
.
Не отвечаю на ваш вопрос, но просто из любопытства, есть ли скрытая причина не использовать метод шаблона вместо определения версии перегрузки для каждого типа?
class SomeClass
{
public:
...
template <typename T>
void Method(T paramater);
};
Как уже указывал Чарльз, это происходит из-за нежелательного неявного преобразования. Если вы хотите избежать этого, используйте конструктор std :: string:
Метод (std :: string ("строка"));
или приведите его к std :: string:
Method(static_cast<std::string>("string"));
Однако порядок ваших объявлений не важен. Также проверьте правильность написания слова "параметр";)
Помимо проблемы со строкой, есть еще одна проблема. int64_t и int8_t (обычно) являются определениями типов. Поскольку typedef - это просто псевдонимы, они могут относиться к одному и тому же типу, и в этом случае перегрузка не сработает. Но в вашем случае это маловероятно. Просто хотел упомянуть об этом.
Вы можете добавить ключевое слово explict, чтобы взять предполагаемый аргумент.
.