Вопрос, как указано выше, более подробно ниже:
У меня есть класс Money
, с которым нужно иметь дело ... ну, вы уже догадались.Я очень строго запрещаю взаимодействие Money
и double
(*), поэтому следующий код не возможен:
Money m1( 4.50 );
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
Теперь я думаю о разрешенииумножение Money
на int
, как в «у вас есть 6 кусков торта по 4,50 долл. каждый (так что идите и найдите где-нибудь более дешевый торт)».
class Money
{
Money();
Money( const Money & other );
explicit Money( double d );
...
Money & operator*=( int i );
...
}
inline const Money operator*( const Money & m, int i ) { return Money( m ) *= i; }
inline const Money operator*( int i, const Money & m ) { return Money( m ) *= i; }
Это отлично работает, , но ... к сожалению, C ++ делает неявное приведение от double
до int
, поэтому мой первый фрагмент кода неожиданно скомпилируется.Я не хочу этогоЕсть ли способ предотвратить неявное приведение в этой ситуации?
Спасибо!- Робин
(*) Причина: у меня есть много унаследованного кода, который обрабатывает все связанные с Money
вещи с помощью double
, и я не хочу, чтобы эти типы перепутались, пока все не будет работать с Money
.
Редактировать: добавлены конструкторы для денег.
Редактировать: Спасибо всем за ваши ответы.Почти все они были замечательными и полезными.Комментарий Р. Мартиньо Фернандеса «Вы можете сделать inline const Money operator*( const Money & m, double d ) = delete;
» был фактически ответом (как только я переключаюсь на компилятор с поддержкой C ++ 11).Kerrek SB дал хорошую альтернативу без C ++ 11, но в итоге я воспользовался подходом Nicola Musatti «overload long
».Вот почему я отмечаю его ответ как «ответ» (также потому, что все полезные идеи появились в качестве комментариев к его ответу).Еще раз спасибо!