Задать вопрос
IDma88
@IDma88
Программист C++

Как сделать перегрузку конструктора без расширения типа?

Имеем две вариации конструктора класса:
CAttribute(const string &name, const uint32_t index, const CSiiData &value);
CAttribute(const string &name, const bool hasIndex, const CSiiData &value);

При попытке объявления переменной этого класса я получаю ошибку:
существует более одного экземпляра конструктора "CAttribute::CAttribute", соответствующего списку аргументов:
функцию "CAttribute::CAttribute(const std::string &name, uint32_t index, const std::string &value)"
функцию "CAttribute::CAttribute(const std::string &name, bool hasIndex, const std::string &value)"
типы аргументов: (const char [12], int, const char [5])

Происходит это из-за расширения типа bool до int.

Суть класса в двух словах: хранения объекта "Атрибут", который содержит имя, значение и может быть частью "массива", как нумерованного, так и без нумерации. Например:
  • "Простой" атрибут:
    attr: value

  • "Нумерованные" атрибуты:
    attr[0]: some_value
    attr[1]: some_value2

  • "Не нумерованные" атрибуты:
    attr[]: some_value
    attr[]: some_value2

Вопрос: возможно ли всё-таки создать конструкторы с указанным набором аргументов?
  • Вопрос задан
  • 117 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Я бы оставил вообще один конструктор вида
explicit CAttribute(const string &name, const CSiiData &value, const bool hasIndex = false, const int32_t index = -1);

Отрицательные index воспринимать как "Не нумерованные" атрибуты.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Alexander1705
Происходит это из-за расширения типа bool до int

Это не так. int может быть приведён как к bool, так и к uint32_t. И компилятор не знает что именно вы имеете в виду. Достаточно явно привести аргумент к нужному типу, чтобы можно было однозначно определить, какой конструктор вы вызываете.

CAttribute("name", (uint32_t)index, "value");
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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