[英]Conversion between 2 template types
我有一個類的代碼(這是一個片段):
template<typename T>
class Pos2 {
public:
T x, y;
Pos2() : x(0), y(0) {};
Pos2(T xy) : x(xy), y(xy) {};
Pos2(T x, T y) : x(x), y(y) {};
};
現在,我還有2個typedef:
typedef Pos2<pos_scalar> Pos;
typedef Pos2<size_scalar> Size;
一切都按預期工作,但當我這樣做時:
Pos p(5.5, 6.5);
Size s(3, 8);
p = s;
我收到此錯誤:
error: conversion from ‘Size {aka Pos2<short int>}’ to non-scalar type ‘Pos’ requested
這很有道理,但我想知道如何修復它= P.
添加構造函數
template <typename Type2> Pos2(const Pos2<Type2> &other)
{ x = other.x; y = other.y; }
您需要定義一個賦值運算符,用於從類型Size
到類型Pos
賦值,因為它們不是同一類型,因此兩者之間沒有默認賦值運算符。
我想你想在這里使用一個模板,所以Pos2
任何實例化都可以用來分配給另一個實例。 例如:
template<typename T>
class Pos2 {
public:
T x, y;
Pos2() : x(0), y(0) {};
Pos2(T xy) : x(xy), y(xy) {};
Pos2(T x, T y) : x(x), y(y) {};
template<typename FromT>
Pos2<T>& operator=(const Pos2<FromT>& from) {
x = from.x;
y = from.y;
return *this;
}
};
您應該對復制構造函數(此處未顯示)執行相同的操作,因為您可能希望在某個時刻在同一方案中復制構造。
這僅適用於類型T
和FromT
之間的賦值,即pos_scalar
和size_scalar
。 如果不是,請嘗試為賦值運算符添加正確的顯式轉換和/或模板特化。
此外,如果Pos2
任何成員是私人/受保護的,您將需要與分配操作員交friend
或提供足夠的getter。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.