先拷一段代码, 出之于《C++程序设计教程》第二版,钱能主编.
-
#include <iostream>
-
using namespace std;
-
-
template<typename T>
-
class Node{
-
public:
-
Node(T& d):c(d),next(0),pref(0){}
-
T c;
-
Node *next,*pref;
-
};
-
-
template<typename T>
-
class List{
-
Node<T> *first, *last;
-
public:
-
List();
-
void add(T& c);
-
void remove(T& c);
-
Node<T>* find(T& c);
-
void print();
-
~List();
-
};
-
-
template<typename T>
-
List<T>::List():first(0),last(0)
-
{}
-
-
template<typename T>
-
void List<T>::add(T& n)
-
{
-
Node<T>* p = new Node<T>(n);
-
p->next = first;
-
first = p;
-
(last?p->next->pref:last) = p;
-
}
-
-
template<typename T>
-
void List<T>::remove(T& n)
-
{
-
Node<T> *p = find(n);
-
if(!p) return;
-
(p->next?p->next->pref:last) = p->pref;
-
(p->pref?p->pref->next:first) = p->next;
-
delete p;
-
}
-
-
template<typename T>
-
Node<T>* List<T>::find(T& n)
-
{
-
for(Node<T> *p = first; p;p=p->next)
-
{
-
if(p->c == n) return p;
-
}
-
return 0;
-
}
-
-
template<typename T>
-
List<T>::~List()
-
{
-
for(Node<T> *p; p = first;delete p)
-
first = first->next;
-
}
-
-
template<typename T>
-
void List<T>::print()
-
{
-
for(Node<T>* p=first;p;p=p->next)
-
cout<< p->c<<" ";
-
cout<< "\n";
-
}
-
-
int main()
-
{
-
List> dList;
-
double a = 3.6;
-
double b = 5.8;
-
dList.add(3.6); //报错:main.cpp:77: error: no matching function for call to 'List::add(double)'
// main.cpp:29: note: candidates are: void List::add(T&) [with T = double]
-
dList.add(5.8); //报错:main.cpp:78: error: no matching function for call to 'List::add(double)'
// main.cpp:29: note: candidates are: void List::add(T&) [with T = double]
-
dList.print();
-
-
int c=5;
-
int d=8;
-
List<int> iList;
-
iList.add(c);
-
iList.add(d);
-
iList.print();
-
}
这段代码出自类模版那一章, 用来定义一个链表的类模版. 但是我在编译到77,78行的时候出现了错误:
main.cpp: In function 'int main()':
main.cpp:77: error: no matching function for call to 'List::add(double)'
main.cpp:29: note: candidates are: void List::add(T&) [with T = double]
main.cpp:78: error: no matching function for call to 'List::add(double)'
main.cpp:29: note: candidates are: void List::add(T&) [with T = double]
分析一下, 感觉好像也没什么问题, 3.6和5.8作为double型传入到double型的参数没问题呀.
但是我做了下面的实验之后, 就知道了.
把77行, 78行的参数改为下面这样:
-
dList.add(a);
-
dList.add(b);
编译就可以正常通过了!!!
这说明了一个问题, 直接传数字和传变量是不一样的!
c++在对待立即数, 是将其认为为const double型的, 而
dList的定义中说的很明白其类型为double型.
而const double型和double型是不一样的!!! 所以编译会报错!
举例, 比如说这里我把
dList的定义改为下面这样:
-
List<const double> dList;
那么就可以用
dList.add(3.6);
dList.add(5.8); 这种方式去调用了.
而且, 这里我做了个实验, 把
dList的定义改为下面这样之后:
-
List<const double> dList;
这种用法也是ok的:
-
dList.add(a);
-
dList.add(b);
因为, 这样相当于把a,b这两种double类型隐含转换成了const double类型, 只要保证a, b不会被改变就OK了.
我们可以做下面这个测试, 在void List::add(T& n)函数后面加上这么一行n=n+1;如下:
template
void List::add(T& n)
{
Node* p = new Node(n);
p->next = first;
first = p;
(last?p->next->pref:last) = p;
n=n+1;
}
就会发现报这么一个编译错误:
main.cpp: In member function 'void List::add(T&) [with T = const double]':
main.cpp:78: instantiated from here
main.cpp:35: error: assignment of read-only reference 'n'
所以! 在模版做类型转换的时候, 一定一定一定要注意!!!
阅读(1646) | 评论(0) | 转发(0) |