我試圖讓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;
}
編輯:我使用Visual Studio 2013年
我看到你的答案*可能*正確,也許我使用Visual Studio 2013的事實是這裏的問題。我嘗試了構造函數,它沒有任何區別。刪除=是一個語法錯誤(「expected a;」)。 – Robinson
@Robinson有兩個'='s顯然是錯誤的。你有'auto x = T()= {{...}};',它試圖分配一個右值。這可能是VS13不支持支持正確初始化?我不熟悉它的侷限性。 – Barry
我不認爲它是,不。我必須像這樣初始化std :: array。我會在2015年之後嘗試。 – Robinson