Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;运算符重载:用户定义类型与浮点值的乘积_C++_Operator Overloading_Binary Operators - Fatal编程技术网

C++ C++;运算符重载:用户定义类型与浮点值的乘积

C++ C++;运算符重载:用户定义类型与浮点值的乘积,c++,operator-overloading,binary-operators,C++,Operator Overloading,Binary Operators,我尝试在4种情况下实现乘法运算符(运算符*) 假设我有一个类雨 namespace manchester { namespace manchester_private_dont_use_this { template<typename T> class rain { public: rain(T initial_rain) : m_rain(initi

我尝试在4种情况下实现乘法运算符(
运算符*

假设我有一个
类雨

namespace manchester {

    namespace manchester_private_dont_use_this {

        template<typename T>
        class rain
        {

        public:
            rain(T initial_rain)
                : m_rain(initial_rain)
            {
            }

        private:
             T m_quantity_of_rain;
        };

    }

} //namespace manchester

再一次,我不确定,所以我想问可能比学错要好。我想到的四种情况是上面两种,然后当
float
的两个隐藏情况在
T
是type
double`的情况下可以转换为double
,反之亦然。

您可以直接使用double,让隐式converson来完成任务,但请注意,由于float的大小小于double,这可能会导致数据丢失

inline rain<T> operator*(const rain<T>& _rain, const double _t)
{
    return rain<T>(_rain.m_quantity_of_rain * _t);
}

inline rain<T> operator*(const double _t, const rain<T>& _rain)
{
    return rain<T>(_rain.m_quantity_of_rain * _t);
}
inline rain操作符*(常数雨和常数雨,常数双)
{
返程雨(_rain.m_rain数量_rain*_t);
}
内联rain运算符*(常数双精度、常数雨和常数雨)
{
返程雨(_rain.m_rain数量_rain*_t);
}

另外,如果您试图避免特定的模板实例化,例如
rain
,那么当有人试图这样做时,您可能会抛出编译错误。请参阅此处:

好的,谢谢,我将按照您的建议查看抛出编译器错误的情况。在您刚才给出的示例中,您说过专门使用double可能会导致数据丢失?那么,你建议使用你给出的例子还是我给出的例子?如果你有雨,并且第二个参数是真双精度,那么数据就会丢失。这在你的例子和我的例子中都有,但在我给你的例子中,函数中仍然有double,如果你想避免数据的无损,可以做一些事情,在你的例子中,无损发生在函数本身的调用中。啊,对,我明白了。我建议继续使用我的示例,因为用户必须在使用float和double-one模板类型之间进行选择,因此会假设他们将使用为模板选择的相同类型进行所有运算。(无论如何我都会这么想!)
inline rain<T> operator*(const rain<T>& _rain, const double _t)
{
    return rain<T>(_rain.m_quantity_of_rain * _t);
}

inline rain<T> operator*(const double _t, const rain<T>& _rain)
{
    return rain<T>(_rain.m_quantity_of_rain * _t);
}