Как указать параметр шаблона во время неявного преобразования?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как указать параметр шаблона во время неявного преобразования?

Сообщение Anonymous »

У меня есть шаблонный класс с двумя целыми числами в спецификации шаблона, одним конструктором, который принимает необязательный аргумент int, и одним конструктором типа копирования (M должны совпадать, но N нет).

Код: Выделить всё

template 
class Foo {
public:
Foo(intmax_t initialValue = 0);

template 
Foo(const Foo &other);
};
Из-за неявных правил преобразования существование первого конструктора означает, что вы можете просто присвоить целое число экземпляру этого класса, чего мне не нужно. Итак, я ясно выразился.

Код: Выделить всё

    explicit Foo(intmax_t initialValue = 0);
Пока все хорошо.
Но, реализовав остальную часть класса, я понял, что для конкретного случая, когда M == 0, имеет смысл разрешать присваивать экземпляру класса любое число, и на самом деле это значительно упростит некоторые задачи. Нет проблем, я использую C++20, я могу просто сделать явное условие.

Код: Выделить всё

    template 
explicit (Mx != 0)
Foo(intmax_t initialValue = 0);
Но когда я пытаюсь использовать эту функциональность, говоря Foo a; a = 10, он не компилируется. Ошибка, которую он мне выдает: Нет жизнеспособной перегрузки '='.
Я почти на 90 % уверен, что проблема в параметре N. Он не знает, какую ценность ему придать. Я попробовал скомпилировать класс без N в шаблоне, и все сработало нормально. (Ну, он выдал мне предупреждение о том, что неявный оператор присваивания копии устарел, но он все равно скомпилировался, запустился и дал ожидаемые результаты.)
Дело в том, что особый случай M == 0, тогда N вообще не имеет значения и может быть чем угодно.
Итак, правильно ли я думаю?, Если Итак, как мне приказать ему просто назначить 0 или что-то еще для N, когда M == 0 во время неявного преобразования, и при этом запретить присвоение, когда M != 0?

Подробнее здесь: https://stackoverflow.com/questions/791 ... conversion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»