int& 定义的变量的类型却是 int
听几个高人讨论,写这个程序:
template <typename T, typename C>
struct CompilerTypeCheck
{
};
template <typename T>
struct CompilerTypeCheck<T, T>
{
typedef T value_type;
};
template <typename T, typename C>
void
VarTypeCheckFunction (C c)
{
typename CompilerTypeCheck<T, C>::value_type t = c;
}
template <typename T>
struct CheckType
{
template <typename C>
CheckType (C c)
{
T t = c;
VarTypeCheckFunction<T>(t);
}
};
int
main ()
{
CheckType<int> i(0);
CheckType<int&> r(0); // 编译错误
}
问题点数:20、回复次数:16Top
1 楼smallbull(黑牛)回复于 2004-04-01 00:26:12 得分 2
int&什么意思,引用吗?好像不能在此使用吧,你是不是要CheckType<int*> r(0);Top
2 楼againli(again)回复于 2004-04-01 01:09:47 得分 2
楼上能解释一下吗?!
1.//模板偏特化,为什么模板参数不一致?!
template <typename T, typename C>
struct CompilerTypeCheck
{
};
template <typename T>
struct CompilerTypeCheck<T, T>
{
typedef T value_type;
};
2. typename CompilerTypeCheck<T, C>::value_type t = c;
//调用的时候被解释为第一个模板函数,但是其中不含有value_type啊?,用c这个变量给类别负值?
3. VarTypeCheckFunction<T>(t);
//这句语法实在看不懂,指教
Top
3 楼againli(again)回复于 2004-04-01 01:10:12 得分 0
我最近也在看模板,望高手指教Top
4 楼againli(again)回复于 2004-04-01 01:11:51 得分 0
vc6.0可能很多性能不支持,搂主误怪,呵呵,Top
5 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-01 09:09:01 得分 5
这点毫无争论
CheckType<int&> r(0);
指定的CheckType模板参数是int&,而0确是int
所以
template <T=int&,C=int> //伪码
CheckType<T>::CheckType(C)
接着
VarTypeCheckFunction<T>(t); //t的类型是C
接着
typename CompilerTypeCheck<T, C>::value_type t = c; //没有匹配CompilerTypeCheck的偏特化版本
而是匹配的
template <typename T, typename C>
struct CompilerTypeCheck
{
};
这里面没有typedef T value_type,所以编译到typename CompilerTypeCheck<T, C>::value_type t = c;出错Top
6 楼cxjddd(又是花开时)回复于 2004-04-01 12:59:07 得分 0
to againli(again):
2、typename CompilerTypeCheck<T, C>::value_type 里的 T 和 C 并不与前面的一样,编译器会根据实际类型来选择的。实际上,T、C 完全可能是同一类型。
3、VarTypeCheckFunction 有两个类型参数,由于通过参数 c 可以确定类型 C,所以只需给定类型 T。写起来就象 VarTypeCheckFunction<T>(c)。也可以写完整:VarTypeCheckFunction<T, C>(c)。Top
7 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2004-04-01 14:37:03 得分 2
mark先!看到模板就头痛!Top
8 楼againli(again)回复于 2004-04-01 15:12:14 得分 2
呵呵,我想的和辣子高人有点类似
但是对于模板使用还有一些问题。
1。
template <typename T> //这里不应该是template<typename T,typename C>吗~?
struct CompilerTypeCheck<T, T>
{
typedef T value_type;
};
2。
VarTypeCheckFunction<T>(t); //为什么一定要如此声明,不应该是
//VarTypeCheckFunction(t);吗?难道函数模板也可以如此?
在请教Top
9 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-01 15:29:55 得分 2
template <typename T> //这里不应该是template<typename T,typename C>吗~?
struct CompilerTypeCheck<T, T>
{
typedef T value_type;
};
这是CompilerTypeCheck的偏特化版,就是针对两个类型一样时
=========================================================
如果VarTypeCheckFunction(t); 就错了,因为VarTypeCheckFunction的typename T不知道为何物
只有
VarTypeCheckFunction<T>(t);
^ 这样才能告诉编译器T是什么,这里的T就是CheckType的TTop
10 楼againli(again)回复于 2004-04-01 19:09:40 得分 1
这是CompilerTypeCheck的偏特化版,就是针对两个类型一样时
-->模板偏特化我是知道的,但是在偏特化的时候,是不是模板可以不一致,
template<typename T,typename C> 可以换成 template <typename T> 或者这样说,我随便声明模板
template<class T,class V, class Z, class M>//这里可以随便声明吗?
struct CompilerTypeCheck<V, V>
{
typedef T value_type;
};
Top
11 楼againli(again)回复于 2004-04-01 19:16:53 得分 1
如果VarTypeCheckFunction(t); 就错了,因为VarTypeCheckFunction的typename T不知道为何物
只有
VarTypeCheckFunction<T>(t);
^ 这样才能告诉编译器T是什么,这里的T就是CheckType的T
--〉通俗一点理解是不是这样,因为参数推演只能推出一个参数(C),所以函数调用的时候
还需要再加上一个莫板参数,那是不是如果莫板函数定义成
template <typename T, typename C, typename TT>
void VarTypeCheckFunction (C c)
{
typename CompilerTypeCheck<T, C>::value_type t = c;
}
函数调用的时候就要 VarTypeCheckFunction<T, TT>(t);//假设TT存在
问题比较多,呵呵
Top
12 楼xrdlm(t)回复于 2004-04-01 21:28:07 得分 1
是引用啊Top
13 楼cxjddd(又是花开时)回复于 2004-04-02 19:52:55 得分 0
template<class T,class V, class Z, class M>//这里可以随便声明吗?
struct CompilerTypeCheck<V, V>
{
typedef T value_type;
};
这个特化在 GCC3.2 里编译是不通过的。看了出错提示,我觉得,特化时列出的所有参数,必须可以恰好转换成原参数。如 <T> 可以转换成 <T, T>。或者如
template<class T, class V, class Z>
struct CompilerTypeCheck<T, std::pair<V, Z> >
{
};
通过 <T, V, Z> 转换成了 <T, std::pair<V, Z> >,这是可以的。Top
14 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-03 15:08:37 得分 0
这个错误就是,特化版本指定的模板参数个数与泛化版本的不同Top
15 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-04 10:12:47 得分 2
一个引用其实在使用上一直被认为是该引用的原型,例如
int i;
int& r=i;
在使用上r完全是一个int。甚至用typinfo::name()得出来的信息也是int,所以这里有些细微的东西容易被忽略
template<typename T>
void fun(T);
fun(r); //把r传递给函数模板fun,那推导出的T到底是int还是int&?其实是int
如果要让T成为int&,那么在实例化时就应该指定模板参数
fun<int&>(r);
Top
16 楼cxjddd(又是花开时)回复于 2004-04-04 16:23:12 得分 0
哈哈,说得太好了:)Top




