Я пытаюсь получить класс R типа T, который можно преобразовать в тип R типа S и наоборот. Оператор = преобразование работает нормально с простым назначением, но когда он пытается использовать его в инициализаторе, он терпит неудачу. Зачем?Оператор преобразования шаблонного типа =
#include <array>
template<class T>
class Rectangle
{
public :
Rectangle(T l, T t, T r, T b) : x1(l), y1(t), x2(r), y2(b)
{
}
template<class S>
Rectangle<T> & operator = (Rectangle<S> const & o)
{
x1 = static_cast<T>(o.x1);
y1 = static_cast<T>(o.y1);
x2 = static_cast<T>(o.x2);
y2 = static_cast<T>(o.y2);
return *this;
}
T x1, y1, x2, y2;
};
int main(void)
{
auto foo = Rectangle<float>(1.0f, 2.0f, 3.0f, 4.0f);
auto bar = Rectangle<double>(1.0, 2.0, 3.0, 4.0);
{
foo = bar; // Converts, ok.
}
{
auto arr = std::array<Rectangle<float>, 2>() = {{
foo,
bar // Error - no appropriate default constuctor
}};
}
return 0;
}
Edit: Я использую Visual Studio 2013.
Я вижу, что ваш ответ * вероятно * правильный и что, возможно, тот факт, что я использую Visual Studio 2013, является проблемой здесь. Я попробовал конструктор, и это не имело значения. Удаление = - это синтаксическая ошибка («ожидается a;»). – Robinson
@ Robinson Наличие двух '=' s явно неверно. У вас есть 'auto x = T() = {{...}};', который пытается назначить rvalue. Может быть, VS13 просто не поддерживает инициализацию скобки правильно? Я не знаком с его ограничениями. – Barry
Я не думаю, что это так, нет. Мне нужно инициализировать std :: array. Я постараюсь с 2015 годом. – Robinson