# include <iostream># include <typeinfo>
using namespace std;
template <typename T, typename U>
struct Pair
{
T first;
U second;
Pair():first(), second(){}
Pair(const T& a, const U& b):first(a), second(b)
{
cout << "typeid(T).name():" << typeid(T).name() << endl;
cout << "typeid(U).name():" << typeid(U).name() << endl;
}
};
template <typename T, typename U>
ostream& operator<<(ostream& o, const Pair<T, U>& p)
{
return o << p.first << ':' << showpoint << p.second;
}
template <typename T, typename U>个
/*********************这里不能够加引用, 加上会出错, 请问为什么??*****************/
Pair<T, U> mp(const T& f, const U& s)
{
return Pair<T, U> (f, s);
}
int main()
{
cout << Pair<int, double>(20, 1.782) << endl;
//这样识别太麻烦我写了一个函数模板来实现
cout << mp(12, 2.0) << endl;//使用引用没有问题
cout << mp("hello", 19) << endl;//使用引用有问题, 为什么??
cout << typeid("hello").name() << endl;
return 0;
}
为什么不加引用可以正确执行呢?不加引用他的类型还是char [6]的啊!他是如何执行的啊??
追答一般加引用,是希望直接返回对象内部的某个成员(同时可减少一次拷贝构造)。或返回函数参数中的参数,能够让操作符或函数连写。加不加引用和是否可执行没有关系。
模版技术不是动态执行的。而是在编译的时候,根据调用情况,进行语法展开。展开出实际代码再编译其代码形成最终程序。
我明白加引用的含义是为了直接使用我的意思是我将引用去掉之后他就可以正确的执行了!只是为什么?“?
追答引用只能引用在有名变量上。
不能使用在匿名变量上。
这里的Pair (f, s);就是生成一个匿名对象。