針對書中第五章
問題1 :
在重載=後,不同數據類型的stack賦值
template <typename T, template <typename, typename> class CONT>
template <typename T2, template <typename, typename> class CONT2>
Stack<T, CONT>& Stack<T, CONT>::operator= (Stack<T2, CONT2> const& op2)
{
/*if ((void *)this == (void *)op2){
return *this;
}*/
Stack<T2, CONT2> tmp(op2);
elems.clear();
while (!tmp.empty()){
elems.push_front(tmp.top());
tmp.pop();
}
return *this;
}
這是重載部分代碼(與書中一致),註釋掉的部分爲VS2013編譯不通過的部分try{
Stack<int> intStack;
Stack<float> floatStack;
intStack.push(42);
intStack.push(7);
floatStack.push(7.7);
floatStack = intStack;
std::cout << floatStack.top() << std::endl;
floatStack.pop();
std::cout << floatStack.top() << std::endl;
floatStack.pop();
std::cout << floatStack.top() << std::endl;
floatStack.pop();
}
catch (std::exception const& ex){
std::cerr << "Exception: " << ex.what() << std::endl;
}
main函數測試代碼(與書中一致)
結果與 p51 頁相同,說明按書中重載之後的=號,並沒有按原棧的數據類型。
這一點與 p43 頁“在賦值以後,floatStack的元素仍然是float(浮點型)類型,因此它的top()仍然返回一個浮點數。”說法不一致。
但是
Stack<T2, CONT2> tmp(op2);
//elems.clear();
while (!tmp.empty()){
elems.push_front(tmp.top());
tmp.pop();
}
當重載中,將clear()註釋掉後
由於沒有clear(),所以原來floatStack中的7.7沒有被刪除,輸出的時候7.7和後來從intStack中賦值來的整型各自按照自己數據類型打印。
問題 2:
p45,當模版參數默認值設爲deque,並且調用push_front()
template <class T, typename CONT = std::deque<T>>
class Stack
重載部分
template<typename T, typename CONT>
template<typename T2, typename CONT2>
Stack<T, CONT>& Stack<T, CONT>::operator= (Stack<T2, CONT2> const& op2)
{
/*if ((void *)this == (void *)op2){
return *this;
}*/
Stack<T2, CONT2> tmp(op2);
elems.clear();
while (!tmp.empty()){
elems.push_front(tmp.top());
tmp.pop();
}
return *this;
}
而在使用中用vector作爲內部容器書中原文“因爲自定義的模版賦值運算並不是並不可少的,所以在不存在push_front()的情況下,某些程序並不會出現錯誤信息,而且也能正常運行。”
於是乎,採用這樣的測試代碼
Stack<int/*, std::vector<int>*/> intStack;
Stack<float/*, std::vector<int>*/> floatStack;
intStack.push(1);
intStack.push(2);
intStack.push(3);
floatStack.push(1.1);
floatStack.push(1.2);
floatStack.push(1.3);
floatStack = intStack;
while (!floatStack.empty()){
std::cout << floatStack.top() << std::endl;
floatStack.pop();
}
system("pause");
當都採用默認參數deque時,程序沒有問題。
當都採用vector時
同時,在同爲vector的情況下,如果不進行=操作,同樣不抱錯。
而且
Stack<int, std::vector<int>> intStack;
Stack<float/*, std::vector<int>*/> floatStack;
作爲等式右邊的intStack採用vector,而左邊的floatStack採用默認值時,也可以通過
*************************************************************************************************************************
結論:
針對問題1,可能的結果是數據保持原有的數據類型,書中所謂的不改變只是這個Stack類,本身不改變,但是被賦值的數據同樣不改變
針對問題2,書中原文“因爲自定義的模版賦值運算並不是並不可少的,所以在不存在push_front()的情況下,某些程序並不會出現錯誤信息,而且也能正常運行。”
的意思是,從語法角度來講並沒有錯誤,而且並不是靜態鏈編,所以只要代碼不執行,就不會發生錯誤。
學習的書籍爲《C++ Templates 中文版》(人民郵電出版社)
所有原文和書上範例都來自於此