随笔 - 181  文章 - 15  trackbacks - 0
<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(1)

随笔分类

随笔档案

My Tech blog

搜索

  •  

最新评论

阅读排行榜

评论排行榜

最近开始系统学习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 阅读(234) 评论(0)  编辑 收藏 引用 所属分类: 我的读书笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理