2015-01-02 58 views
0

我無法調用模板基類的模板賦值運算符重載方法。這是我到目前爲止有:模板基類的模板運算符重載

BaseClass.h:

template<typename T> 
class BaseClass 
{ 
    template<typename U> 
    BaseClass<T>& operator=(const BaseClass<U>& o) 
    { 
     return *this; 
    }; 
}; 

ChildClassInt.h:

#include "BaseClass.h" 
class ChildClassInt : public BaseClass<int> 
{ 
}; 

ChildClassFloat.h:

#include "BaseClass.h" 
class ChildClassFloat : public BaseClass<float> 
{ 
}; 

的main.cpp:

#include "ChildClassInt.h" 
#include "ChildClassFloat.h" 

int main() 
{ 
    const ChildClassFloat floatClass; 

    ChildClassInt intClass; 

    return 0; 
} 

如何調用operator=()方法intClass並將其傳遞floatClass

+1

你可能意思是'return * this;'我猜? –

+0

您的賦值操作符不執行任何操作。 – Snps

+0

這是你在找什麼 - 'intClass.BaseClass :: operator =(floatClass);'? – Praetorian

回答

1

intClass始終有一個隱式定義的賦值運算符,它總是隱藏基類的賦值運算符。顯式調用基類的賦值運算符需要明確的資格:

intClass.BaseClass<int>::operator=(floatClass); 

(注:您的代碼中有兩個誤區一是BaseClass<int>::operator=是私人其次,它應該返回*this,不this。)

然而,你可能不應該這樣做。一般來說,分配給一個子對象可能會導致一個完整的對象中斷,因爲基類賦值操作符不知道派生類的不變量。如果你真的需要一個ChildClassFloat分配給ChildClassInt,你應該定義一個賦值操作符:

ChildClassInt& ChildClassInt::operator=(const ChildClassFloat& c) { 
    BaseClass<int>::operator=(c); 
    return *this; 
} 

然後用戶可以這樣做:

intClass = floatClass; 

由於這賦值運算符是執行工作的一部分它知道如何以保留ChildClassInt的不變量的方式執行分配,並且在實施改變時將在必要時進行更新。另一方面,不能期望用戶知道是否直接對基類進行部分分配將起作用,並且即使這樣做,通過改變類實現,用戶代碼也可隨時被破壞。