int& 定义的变量的类型却是 int

cxjddd 2004-04-01 12:03:05
听几个高人讨论,写这个程序:
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); // 编译错误
}
...全文
81 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jinhao 2004-04-04
  • 打赏
  • 举报
回复
一个引用其实在使用上一直被认为是该引用的原型,例如
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);
cxjddd 2004-04-04
  • 打赏
  • 举报
回复
哈哈,说得太好了:)
Jinhao 2004-04-03
  • 打赏
  • 举报
回复
这个错误就是,特化版本指定的模板参数个数与泛化版本的不同
cxjddd 2004-04-02
  • 打赏
  • 举报
回复
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> >,这是可以的。
cxjddd 2004-04-01
  • 打赏
  • 举报
回复
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)。
smallbull 2004-04-01
  • 打赏
  • 举报
回复
int&什么意思,引用吗?好像不能在此使用吧,你是不是要CheckType<int*> r(0);
xrdlm 2004-04-01
  • 打赏
  • 举报
回复
是引用啊
Jinhao 2004-04-01
  • 打赏
  • 举报
回复
这点毫无争论
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;出错
againli 2004-04-01
  • 打赏
  • 举报
回复
如果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存在

问题比较多,呵呵

againli 2004-04-01
  • 打赏
  • 举报
回复
这是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;
};
Jinhao 2004-04-01
  • 打赏
  • 举报
回复
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的T
againli 2004-04-01
  • 打赏
  • 举报
回复
呵呵,我想的和辣子高人有点类似
但是对于模板使用还有一些问题。
1。
template <typename T> //这里不应该是template<typename T,typename C>吗~?
struct CompilerTypeCheck<T, T>
{
typedef T value_type;
};
2。
VarTypeCheckFunction<T>(t); //为什么一定要如此声明,不应该是
//VarTypeCheckFunction(t);吗?难道函数模板也可以如此?

在请教
sharkhuang 2004-04-01
  • 打赏
  • 举报
回复
mark先!看到模板就头痛!
againli 2004-04-01
  • 打赏
  • 举报
回复
vc6.0可能很多性能不支持,搂主误怪,呵呵,
againli 2004-04-01
  • 打赏
  • 举报
回复
我最近也在看模板,望高手指教
againli 2004-04-01
  • 打赏
  • 举报
回复
楼上能解释一下吗?!
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);
//这句语法实在看不懂,指教

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧