2015-10-23 5 views
1

Я пытаюсь получить класс 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.

ответ

3

Есть две проблемы. Во-первых:

auto arr = std::array<Rectangle<float>, 2>() = ... 

Rectangle<T> не по умолчанию, конструктивны, поэтому () не будет работать. В любом случае, учитывая второй =, я подозреваю, что это была только опечатка. Как только вы исправите это:

auto arr = std::array<Rectangle<float>, 2>{{ 
     foo, 
     bar // Still error 
    }}; 

Теперь у вас есть оператор присваивания, но мы не назначаем его. Мы строим. Так что вам нужно, это конструктор:

template <class S> 
Rectangle(Rectangle<S> const& o) 
    : x1(o.x1) 
    , y1(o.y1) 
    , x2(o.x2) 
    , y2(o.y2) 
{ } 
+0

Я вижу, что ваш ответ * вероятно * правильный и что, возможно, тот факт, что я использую Visual Studio 2013, является проблемой здесь. Я попробовал конструктор, и это не имело значения. Удаление = - это синтаксическая ошибка («ожидается a;»). – Robinson

+0

@ Robinson Наличие двух '=' s явно неверно. У вас есть 'auto x = T() = {{...}};', который пытается назначить rvalue. Может быть, VS13 просто не поддерживает инициализацию скобки правильно? Я не знаком с его ограничениями. – Barry

+0

Я не думаю, что это так, нет. Мне нужно инициализировать std :: array. Я постараюсь с 2015 годом. – Robinson

0

Для класса А ConverTable к классу B нужно определить оператор преобразования, не является оператором присваивания.

Пример:

operator B() { 
    B b; 
    b.populate_from(this); 
    return b; 
} 
1

Что вам нужно, это преобразование «копия» Конструктор

template<class S> 
Rectangle(Rectangle<S> const & o) : Rectangle(o.x1, o.x2, o.y1, o.y2) 

Когда вы пишете код как:

A x = {a}; 

Вы действительно используете конструктор (с аргументом a), а не оператор присваивания.

Смежные вопросы