Вопрос такой же, как указано выше, более подробная информация ниже:
У меня есть класс Money
разобраться с ... ну, вы уже догадались, с чем. Я очень строго отношусь к тому, чтобы не разрешать Money
и double
взаимодействовать (*), поэтому следующий код не возможен:
Money m1( 4.50 );
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
Теперь я думаю о разрешении умножения денег
на 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
, и я не хочу, чтобы эти типы путались, пока все запустить с Деньги
.
Edit: Добавлены конструкторы для денег.
Edit: Спасибо всем за ответы. Почти все они были замечательными и полезными. Комментарий Р. Мартиньо Фернандеса «вы можете сделать inline const Money operator * (const Money & m, double d) = delete;
» был фактически ответом (как только я перейду на C ++ 11 -поддерживающий компилятор). Kerrek SB дал хорошую альтернативу не-C ++ 11, но в итоге я использовал подход Никола Мусатти "overload long
". Вот почему я помечаю его ответ как «ответ» (также потому, что все полезные идеи возникли в виде комментариев к его ответу). Еще раз спасибо!