C++模板類的一個賦值問題


對於以下類模板,如果想要實現類賦值,使用assign()函數。如下

template<class T>
class MyClass{
private:
    T value;
public:
    void setValue(T& _value){
        value = _value;
    }
    void assign(const MyClass<T> &x){
        value = x.value;
    }
    T getValue(){
        return value;
    }
};
int main(void)
{
    MyClass<double> d;
    MyClass<double> dd;
    double temp=23.123;
    d.setValue(temp);
    dd.assign(d);
    cout << d.getValue() << endl << dd.getValue() << endl;
    return 0;
}

如果,兩個類的 T 不一樣,再使用assign()方法進行賦值

int main(void)
{
    MyClass<double> d;
    MyClass<int> i;
    double temp=23.123;
    d.setValue(temp);
    i.assign(d);
    cout << d.getValue() << endl << i.getValue() << endl;
    return 0;
}

問題如下

可以看到,assign()函數渴望要一個const MyClass<int>類型的對象作為參數,但是卻得到了一個MyClass<double>的對象。同時MyClass<double>無法轉換為const MyClass<int>,於是編譯器就會報錯。

 

我們需要重新定義一下MyClass的assign函數,使得上述賦值行的通。

    template<class X>                                   //添加X
    void assign(const MyClass<X> &x){           //把要用來賦值的x定義成另一種類型X
        value = x.getValue();
    }

這樣,上述賦值就可以工作了。

只要從X到T的賦值可以執行,那這個assign函數就可以執行。這樣其實是避免了必須要讓assign函數參數中的 T 必須和assign所屬對象的 相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM