LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 974|回复: 4

c++ template模板问题,编译不出来

[复制链接]
发表于 2003-6-11 16:25:32 | 显示全部楼层 |阅读模式
《c++primer plus》8.9例题
改动一点,不能编译?
//funtmp.cc
#include<iostream>
using namespace std;
template<class any>
void swap(any &a,any &b);

int main()
{
        int a;
        a=4;
        int b;
        b=5;
        double c=3.3;
        double d=4.4;
        swap(a,b);
        swap(c,d);
        cout<<"a b"<<a<<"   "<<b<<endl;
        cout<<"c d"<<c<<"   "<<d<<endl;
        return 0;
}

template<class any>
void swap(any &a,any &b)
{
        any tmp;
        tmp=a;
        a=b;
        b=tmp;
        return;//书上没有return;
}


#g++ funtmp.cc
//出错信息:
funtmp.cc: In function `int main()':
funtmp.cc:15: call of overloaded `swap(int&, int&)' is ambiguous
funtmp.cc:5: candidates are: void swap(any&, any&) [with any = int]
/usr/include/c++/3.2/bits/stl_algobase.h:121:                 void
   std::swap(_Tp&, _Tp&) [with _Tp = int]
funtmp.cc:16: call of overloaded `swap(double&, double&)' is ambiguous
funtmp.cc:5: candidates are: void swap(any&, any&) [with any = double]
/usr/include/c++/3.2/bits/stl_algobase.h:121:                 void
   std::swap(_Tp&, _Tp&) [with _Tp = double]
把swap定义在文件开头也一样。
改怎么搞,我在vc6.0通过。
发表于 2003-6-11 17:06:28 | 显示全部楼层
因为STL里已经定义过swap了。
不过我编译了一下,没问题呀。你的g++是哪个版本的?
发表于 2003-6-11 17:07:19 | 显示全部楼层
这是因为在std名字空间中有swap,和你定义的swap冲突了。
解决的办法有两种:
1.给你的swap改个名字。
2.不要用using namespace std;改用
using std::cout;
using std::endl;
当然,最好是两个都用,你用std空间里的名字容易产生误解,用using namespace std引入整个std空间实际上污染了程序名字空间,不过做例子程序练练手引入整个名字空间比较好用,代码少嘛。
发表于 2003-6-11 17:08:30 | 显示全部楼层
不如自己定义一个namespace,然后把swap放里面,呵呵呵
 楼主| 发表于 2003-6-11 19:16:02 | 显示全部楼层
愣个索,
哦,书上面是大写的Swap
我是小写,swap
谢谢各位
版本 gcc 3.2 (redhat8自带。g++也一眼吧)

改过之后,能成功编译了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表