Как обеспечить неявный вызов конструктора шаблонного класса в переопределенном операторе?

Сначала создадим класс, хранящий числовое значение:
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...
  • Вопрос задан
  • 311 просмотров
Решения вопроса 1
@shtr Автор вопроса
Похоже лучший вариант это специализация:
MyVal<int> operator *(const MyVal<int> &x, const MyVal<int> &y) 
{
  return MyVal<int>(x.val_ * y.val_);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@iv_k
b = MyVal<int>(1) * a;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы