最近開始系統學習STL.首先找到這本書--The C++ Standard Library : A Tutoral and Reference然后一邊看書一邊找著里面的例子做做.個人認為比較重要的內容將會在這里進行記錄.
與此相關的閱讀和實驗過程都是在linux下進行的,所以這些讀書筆記也會在linux下完成.這里不由得感嘆一下--博客園的博客系統的通用性確實做得非常好,至少我在fire fox下面下使用沒有感覺到任何的差別.
首先是模板Template.
template<class T>
class MyClass
{
private:
T value;
public:
const T getValue()
{
return value;
}
void assign(const MyClass<T> &m)
{
value=m.value;
}
MyClass(T theValue)
{
value=theValue;
}
};
上面的MyClass就是我的模板類.然后我按照如下的方式進行調用,是沒有問題的:
MyClass<int> i1(1);
MyClass<int> i2(2);
cout<<"\n";
cout<<i1.getValue()<<"\n";
cout<<i2.getValue()<<"\n";
i1.assign(i2);
cout<<i1.getValue()<<"\n";
exit(0);
但是如果這樣,就會出現問題.
MyClass<int> i1(1);
MyClass<float> f3(3.9);
f3.assign(i1);
編譯器會告訴你:
TemplateExp.cpp: In function ‘int main()’:
TemplateExp.cpp:36: 錯誤: 對 ‘MyClass<float>::assign(MyClass<int>&)’ 的調用沒有匹配的函數
TemplateExp.cpp:13: 附注: 備選為: void MyClass<T>::assign(const MyClass<T>&) [with T = float]
因為在編譯器看來
void assign(const MyClass<int> &m)和
void assign(const MyClass<float> &m)是不同的.
這樣就必須assign進行修改.我在這里建立了一個新的函數assignX,如下:
template <class X>
void assignX(MyClass<X> &m)
{
value=m.getValue();
}
在調用的時候 這樣寫就沒有問題了:
MyClass<int> i1(1);
MyClass<float> f3(3.9);
f3.assignX(i1);
cout<<f3.getValue()<<"\n";
exit(0);
有一點需要注意,在assignX中,不能夠只接使用m.value而要使用m.getValue().正如書中所說:
Note that the argument x of assign() now differs from the type of *this. Thus, you can't
access private and protected members of MyClass<> directly. Instead, you have to use
something like getValue() in this example.
由于類型不同了(即MyClass<float>不同于MyClass<int>)所以就不能使用this.因而要另外建立一個獲取值的函數.
實際上上面寫的代碼和書中還是有所不同的.比較重要的區別是函數assign.
書中的參數為:
template<class X>
assign(const MyClass<X>& x)
這樣實際上是不能得到x.getValue()的.編譯器會給出這樣的提示:
TemplateExp.cpp:36: instantiated from here
TemplateExp.cpp:20: 錯誤: passing ‘const MyClass<int>’ as ‘this’ argument of ‘const T MyClass<T>::getValue() [with T = int]’ discards qualifiers
但是修改成
template<class X>
assign(MyClass<X>& x)
就不會有問題了
posted on 2007-06-09 23:53
littlegai 閱讀(244)
評論(0) 編輯 收藏 引用 所屬分類:
我的讀書筆記