标准库中指针可以用应用的方式传参,为什么自定义的就不行?

xiongyu2006 2009-10-21 01:09:32
标准库中swap有这样的定义

template<class _Ty> inline
void swap(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
if (&_Left != &_Right)
{ // different, worth swapping
_Ty _Tmp = _Left;

_Left = _Right;
_Right = _Tmp;
}
}


_Ty是个 typedef void _Ty,这_Ty还有其他什么含义吗? 仅仅是个void?
这样写为什么不行?

template<class T>
void swap2(T& _Left, T& _Right)
{ // exchange values stored at _Left and _Right
if (&_Left != &_Right)
{ // different, worth swapping
T _Tmp = _Left;

_Left = _Right;
_Right = _Tmp;
}
}
int main()
{
int a=10,b=20;
int *p=&a,*q=&b;
swap2(p,q);
cout<<a<<"\t"<<b<<endl;
return 0;
}

...全文
174 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyongde2002 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mxssys 的回复:]
我也整不明白。下面的代码可以编译通过,但不能交换A和B的内容。

并且如果不定义:typedef void _Ty 而是把_Ty换成如T或其它符号,就编译不过了。不知哪位大侠能详解一下。

二楼的兄弟应该是高手,能详细解决一下吗?先谢谢你。这个问题很郁闷。

typedef void _Ty
template <class _Ty>
void swap2(_Ty& _Left, _Ty& _Right)
{    // exchange values stored at _Left and _Right
    if (&_Left != &_Right)
    {    // different, worth swapping
        _Ty _Tmp = _Left;

        _Left = _Right;
        _Right = _Tmp;
    }
}
int main()
{
    int a=10,b=20;
    int *p=&a,*q=&b;
    swap2(p,q);
    cout < <a < <"\t" < <b < <endl;
    return 0;
}
[/Quote]

不定义typedef void _Ty可以通过。刚刚给你试过。我倒不知道定义到底是什么意思
yangyongde2002 2009-10-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiongyu2006 的回复:]
回1楼:正在努力中..
回2,3楼:swap(*p,*q)和 swap(a,b)都是可以交换内容的. < <c++标准程序库>>中有例子把指针用引用的方式来传递的类模板,传的是个地址.看到了这个swap就想自己实现下.为什么直接是void就不行?非得类似于
typedef void _Ts这样的定义后才能编译通过
[/Quote]

template<class _Ty> inline 。。在这里_Ty可以换成任何东西的。
swap(*p,*q)和 swap(a,b)都是可以交换内容的。对,是可以交换。swap(*p,*q)交换的是p,q指向的内容,所以a,b也会变。如果你swap(p,q),因为p,q 是两个地址,所以交换的是地址的值,也就是p指向b,q指向a.但是a,b并不会变。
mxssys 2009-10-21
  • 打赏
  • 举报
回复
我也整不明白。下面的代码可以编译通过,但不能交换A和B的内容。

并且如果不定义:typedef void _Ty 而是把_Ty换成如T或其它符号,就编译不过了。不知哪位大侠能详解一下。

二楼的兄弟应该是高手,能详细解决一下吗?先谢谢你。这个问题很郁闷。

typedef void _Ty
template<class _Ty>
void swap2(_Ty& _Left, _Ty& _Right)
{ // exchange values stored at _Left and _Right
if (&_Left != &_Right)
{ // different, worth swapping
_Ty _Tmp = _Left;

_Left = _Right;
_Right = _Tmp;
}
}
int main()
{
int a=10,b=20;
int *p=&a,*q=&b;
swap2(p,q);
cout<<a<<"\t"<<b<<endl;
return 0;
}
xiejijun_05 2009-10-21
  • 打赏
  • 举报
回复
swap(*p,*q)和 swap(a,b)都是可以交换内容的.
swap函数的传参方式是引用传递,但是不是地址是别名。
我所不理解的是
“为什么直接是void就不行?非得类似于
typedef void _Ts这样的定义后才能编译通过”
是什么意思?
xiongyu2006 2009-10-21
  • 打赏
  • 举报
回复
回1楼:正在努力中..
回2,3楼:swap(*p,*q)和 swap(a,b)都是可以交换内容的.<<c++标准程序库>>中有例子把指针用引用的方式来传递的类模板,传的是个地址.看到了这个swap就想自己实现下.为什么直接是void就不行?非得类似于
typedef void _Ts这样的定义后才能编译通过
yshuise 2009-10-21
  • 打赏
  • 举报
回复
_Ty代表任何可以拷贝的对象。你同标准那个没啥区别。

arong1234 2009-10-21
  • 打赏
  • 举报
回复
你要交换a,b应该是swap(a,b),而不是swap(&a,&b), a和&a是完全不同的东西
  • 打赏
  • 举报
回复
交互的是p和q两个指针的值. 没有交换指针指向的值
你 交互前后 cout<<*p<<"\t"<<*q<<endl;试试看
taodm 2009-10-21
  • 打赏
  • 举报
回复
如果你能找出_Ty是个 typedef void _Ty,那么你可能需要认真看看《stl源码剖析》来加强模板编程能力。

64,637

社区成员

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

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