Как сделать класс, присваиваемый примитивам?Или как мне сделать скалярный класс? - PullRequest
3 голосов
/ 02 апреля 2011

Мне было интересно, можно ли сделать мои

class Time
{
    public:
        Time();

        explicit
        Time(
            const double& d);

        Time&
        operator=(
            const Time& time);

        Time&
        operator=(
            const double& d);
};

назначаемыми примитиву double?

Я использую Time как IV много и мне нужно многоскалярные операции над ним, поэтому он должен «смешиваться» с DV, которые обычно являются обычными двойными числами.Добавление второго оператора присваивания сделало трюк с точностью до наоборот.

Однако многие операции все еще невозможны с этим.Я писал операторы вне класса Time, чтобы допускать сложение, вычитание, умножение и деление между Time и double.Но так как операторы присваивания не разрешены вне класса, я не могу преодолеть эту последнюю ошибку:

Error   1   error C2440: 'initializing' : cannot convert from 'double' to 'Time'    linearfit.cpp   67

Кто-нибудь имел опыт работы с этим?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 02 апреля 2011

Вы должны написать / переопределить оператор.В этом случае приведение оператора.Определите метод

operator double() { return double_however_computed_from_your_time; };
3 голосов
/ 02 апреля 2011

Похоже, что указанная вами ошибка связана с тем, что вы пометили Time(const double &d) как explicit. Удалите явное, и неявное преобразование из double в Time должно сработать (при условии, что это также может позволить случиться в те моменты, когда вы этого не хотели). Вероятно, я бы также передал double по значению, а не по константе.

Преобразование из Времени в удвоение будет выполнено с помощью:

class Time { 
// ...
     operator double() const;
};
2 голосов
/ 02 апреля 2011

Вы должны объявить operator double () const, чтобы сделать Time конвертируемым в double. Невозможно перегрузить оператор присваивания для примитивных типов.

...