2012-04-02 14 views
2

パラメータ:デフォルトの代入演算子は、

template <class T> 
class Number 
{ 
    private: 
     T num; 
    public: 
     Number() {} 
     Number(T n) : num(n) {} 
     operator T() const { return num; } 
}; 

int main() 
{ 
    Number<int> n=5; 
    Number<char> c=4; 
    int i; 

    c=int(5); 
    i=n; 
    c=n; 

    return 0; 
} 

コンパイラはc=noperator=ための一致がないと言って三割り当てで立ち往生。 nintに変換されてはならず、cに割り当てられますか?

答えて

4

標準によれば、最大で1つのユーザ定義変換(コンストラクタまたは変換関数)が単一の値に暗黙的に適用されます。ここでは、コンパイラがNumber<char>のコンストラクタとNumber<int>の変換演算子を適用することを期待しています。参照:https://stackoverflow.com/a/867804/677131

2

テンプレート化されたクラスがcharのように構築されている場合は、int演算子がないためです。

実際には、ここではアサイメント演算子はありません。コンストラクタと型演算子のみです。

Number<T>& operator=(Number<T>& rhs); 

あなたがあなた自身の代入演算子を実装する必要があり、これはあなたの問題を解決する必要があります。これは、あなたのコンパイラはおそらく、おそらくの線に沿って、デフォルトの1に入れているだろうことを意味します。一般的な解決策は次のようなものですが、タイプ間の有効な割り当てに依存します。

template <typename T, typename V> 
class Number 
{ 
    private: 
     T num; 
    public: 
     Number() {} 
     Number(T n) : num(n) {} 
     operator T() const { return num; } 
     operator=(V& rhs){ num = rhs; // etc } 
}; 

また、(それはあなたが望むものでない限り)暗黙の型変換を避けるために、あなたのクラスのコンストラクタexplicitを作成する必要があります。

+0

'テンプレート化されたクラスはchar'として構築されています - 私は大きな問題があります。 _as a_ 'char'で構築されたクラス? – sehe

+0

'n'は' int'として構築されます。これは 'int'演算子を持っています。 'c'に' int'sを代入することができます。ところで、それはもう一方の方法では動作しないので、問題は 'char'に' int'を代入しようとしていません。 – baruch

+0

あなたは明確にしていただけますか?私は問題が何であるか理解していない。 – baruch

関連する問題