Сначала создадим класс, хранящий числовое значение:
class MyVal {
public:
int val_;
MyVal(int val = 0) : val_(val) {}
};
Переопределим оператор +:
MyVal operator *(const MyVal &x, const MyVal &y)
{
return MyVal(x.val_ * y.val_);
}
Далее умножаем MyVal непосредственно на число (при этом для значения 1 создается экземпляр MyVal):
MyVal a, b;
b = 1 * a;
Если же класс становится шаблонным
template<class T>
class MyVal {
public:
T val_;
MyVal(T val = 0) : val_(val) {}
};
template<class T>
MyVal<T> operator *(const MyVal<T> &x, const MyVal<T> &y)
{
return MyVal<T>(x.val_ * y.val_);
}
void Test()
{
MyVal<int> a, b;
b = 1 * a;
}
то компилятор выдает " error C2677: binary '*' : no global operator found which takes type 'MyVal' ". Проблема в том, что добавить operator *(const MyVal &x, T val) хотя и можно, но нежелательно. Ищу способ добиться неявного создания MyVal...