Overloading assignment operator in a class template that can cast to another template type
Solution 1
You should do this:
template <class T2>
Number<T>& operator=( const Number<T2>& number )
{
m_value = number.value();
return *this;
}
That is, use T2
in the parameter type, not in the return type!
I would rather use different letter for template parameter:
template <class U>
Number<T>& operator=( const Number<U>& number )
{
m_value = number.m_value; //I would also directly access the member variable!
return *this;
}
I think, it is better to use explicit cast, if you want to use class type as template argument and whose constructor has been declared explicit
:
m_value = static_cast<T>(number.m_value);
By the way, the other operator=
should be implemented as:
Number<T>& operator=(T const & value ) //accept by const reference
{
m_value = value;
return *this; //you've to return!
}
Solution 2
You have some of the T
s in the wrong place. It should be
template <class T2>
Number<T>& operator=( const Number<T2>& number )
{
m_value = number.value();
return *this;
}
This will let you do
Integer a(4);
Float b(6.2f);
a = b;
cout << a.value() << endl;
and it will print 6
, a behaviour similar to that of the int
and float
types you are imitating.
mkroman
Updated on July 20, 2022Comments
-
mkroman almost 2 years
#ifndef NUMBER_HPP #define NUMBER_HPP template <class T> class Number { public: Number( T value ) : m_value( value ) { } T value() const { return m_value; } void setValue( T value ) { m_value = value; } Number<T>& operator=( T value ) { m_value = value; } // template <class T2> // Number<T2>& operator=( const Number<T>& number ) // { // m_value = number.value(); // return *this; // } private: T m_value; }; typedef Number<int> Integer; typedef Number<float> Float; typedef Number<double> Double; #endif // NUMBER_HPP
The commented assignment operator overloading is my attempt to do what I want, I thought it might provide a better description than the one above the snippet.
I want to be able to do the following:
Float a(10); Integer b(20); a = b;
Where
a
then would be casted to anint
and given the value ofb
, but still be an instance of classNumber
.Is it possible? Can you help me out here?
Thanks in advance.
-
mkroman over 12 yearsYep, thanks a lot. @SethCarnegie asked what happened when I uncommented the code, at the same time I uncommented it I realized the way I was checking the result was with printf() using %d instead of %f of the float. Silly. Thanks to both of you.