2014-01-19 94 views
1

我有這段代碼一類(這是一個片段):之間的轉換2模板

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 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

回答

2

添加一個構造函數

template <typename Type2> Pos2(const Pos2<Type2> &other) 
{ x = other.x; y = other.y; } 
+1

什麼是'Type2'?你的意思是'typename Type2'? – 0x499602D2

1

你需要從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_scalarsize_scalar可能這不只是工作。如果不嘗試爲賦值運算符添加正確的顯式轉換和/或模板特化。

此外,如果Pos2的任何成員是私人/受保護的,您將需要friend轉讓運營商或提供足夠的獲得者。