Неоднозначные вызовы конструкторов классов ⇐ C++
Неоднозначные вызовы конструкторов классов
В настоящее время я реализую собственный строковый класс, но столкнулся с некоторыми проблемами с конструкторами классов. Класс представляет собой специальную оболочку для std::string, поэтому в нем есть большинство конструкторов std::string, за исключением конструкторов итераторов, поскольку некоторые системы, в которых будет выполняться код, не поддерживают STL.
Класс также предоставляет некоторые конструкторы, основанные на реализации String в Arduino, в частности числовые переменные для строковых конструкторов, которые показаны ниже:
Конструкторы преобразования чисел:
// беззнаковое целое число string(const uint8_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); string(const uint16_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); string(const uint32_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); string(const uint64_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); // подписанное целое число string(const int8_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); string(const int16_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); string(const int32_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); string(const int64_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); // плавать явная строка (const float Source); строка (const float Source, точность uint8_t); Вкратце: база представляет собой систему счисления, которая будет использоваться для преобразования переменной, где 2 будет двоичным, 8 восьмеричным и 16 шестнадцатеричным, используемые системы счисления: [2,32]. LetterCase – это переменная, которая определяет, следует ли использовать буквы в верхнем или нижнем регистре.
Проблема в том, что этот набор конструкторов становится неоднозначным с одним из конструкторов std::string, в частности с конструктором fill (ниже определения):
string(unsigned int n, char c); При звонке:
CPString::string myString(10,'a'); Компилятор выдает ошибку C2666: перегруженные функции имеют аналогичное преобразование
Я предполагаю, что литерал char преобразуется в uint8_t, можно ли однозначно определить эти конструкторы? Я знаю, что изменение 10 на 10u устраняет двусмысленность вызова, но я хочу найти лучшее решение. При этом также будет принято значение 10 в качестве первого параметра конструктора заполнения.
В настоящее время я реализую собственный строковый класс, но столкнулся с некоторыми проблемами с конструкторами классов. Класс представляет собой специальную оболочку для std::string, поэтому в нем есть большинство конструкторов std::string, за исключением конструкторов итераторов, поскольку некоторые системы, в которых будет выполняться код, не поддерживают STL.
Класс также предоставляет некоторые конструкторы, основанные на реализации String в Arduino, в частности числовые переменные для строковых конструкторов, которые показаны ниже:
Конструкторы преобразования чисел:
// беззнаковое целое число string(const uint8_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); string(const uint16_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); string(const uint32_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); string(const uint64_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode); // подписанное целое число string(const int8_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); string(const int16_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); string(const int32_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); string(const int64_t Source, uint8_t Base = 10, bool LetterCase = CPString::NumberConversion::LetterCase::Mode, bool IntFormat = CPString::NumberConversion::IntFormat::Mode); // плавать явная строка (const float Source); строка (const float Source, точность uint8_t); Вкратце: база представляет собой систему счисления, которая будет использоваться для преобразования переменной, где 2 будет двоичным, 8 восьмеричным и 16 шестнадцатеричным, используемые системы счисления: [2,32]. LetterCase – это переменная, которая определяет, следует ли использовать буквы в верхнем или нижнем регистре.
Проблема в том, что этот набор конструкторов становится неоднозначным с одним из конструкторов std::string, в частности с конструктором fill (ниже определения):
string(unsigned int n, char c); При звонке:
CPString::string myString(10,'a'); Компилятор выдает ошибку C2666: перегруженные функции имеют аналогичное преобразование
Я предполагаю, что литерал char преобразуется в uint8_t, можно ли однозначно определить эти конструкторы? Я знаю, что изменение 10 на 10u устраняет двусмысленность вызова, но я хочу найти лучшее решение. При этом также будет принято значение 10 в качестве первого параметра конструктора заполнения.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Неоднозначные результаты при применении «фильтра» в контексте Polars group_by
Anonymous » » в форуме Python - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-