Как мне предотвратить неявное приведение типа double -> int?

Вопрос такой же, как указано выше, более подробная информация ниже:

У меня есть класс 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 ". Вот почему я помечаю его ответ как «ответ» (также потому, что все полезные идеи возникли в виде комментариев к его ответу). Еще раз спасибо!

19
задан Robin 27 October 2011 в 10:00
поделиться