关于名称空间的问题

xuyouqiang 2007-05-14 11:17:54
头文件:
//namesp.h
//create the pers and debts namespaces
namespace pers
{
const int LEN = 40;
struct Person
{
char fname[LEN];
char lname[LEN];
};
void getPerson(Person &);
void showPerson(const Person &);
};

namespace debts
{
using namespace pers;
struct Debt
{
Person name;
double amount;
};

void getDebt(Debt &);
void showDebt(const Debt &);
double sumDebts(const Debt ar[],int n);
}
名称空间的实现文件:
//namesp.cpp -- namespace
#include<iostream>
#include"namesp.h"

namespace pers
{
using std::cout;
using std::cin;
void getPerson(Person & rp)
{
cout<<"Enter first name: ";
cin>>rp.fname;
cout<<"Enter last name: ";
cin>>rp.lname;
}

void showPerson(const Person & rp)
{
std::cout<<rp.lname<<", "<<rp.fname;
}
}
namespace debts
{
void getDebt(Debt & rd)
{
getPerson(rd.name);
std::cout<<"Enter debt: ";
std::cin>>rd.amount;
}
void showDebt(const Debt &rd)
{
showPerson(rd.name);
std::cout<<": $"<<rd.amount<<std::endl;
}

double sumDebts(const Debt ar[],int n)
{
double total = 0;
for(int i = 0;i<n;i++)
total+=ar[i].amount;
return total;
}
}
主函数:
#include<iostream>
#include"namesp.h"

void other(void);
void another(void);
int main(void)
{
using debts::Debt;
using debts::showDebt;
Debt golf = { {"Benny", "Goatsniff"},120.0};
showDebt(golf);
other();
another();

return 0;
}

void other(void)
{
using std::cout;
using std::endl;
using namespace debts;
Person dg={"Doodles","Glister"};
showPerson(dg);
cout<<endl;
Debt zippy[3];
int i;

for(i=0;i<3;i++)
getDebt(zippy[i]);
for(i=0;i<3;i++)
showDebt(zippy[i]);
cout<<"Total debt: $"<<sumDebts(zippy,3)<<endl;

return;
}

void another(void)
{
using pers::Person;

Person collector={"Milo","Rightshift"};
pers::showPerson(collector);
std::cout<<std::endl;
}
为什么在编译的时候会报如下错误:
Compiling...
namesp.cpp
D:\vc++\MSDev98\MyProjects\PB_9_10\namesp.cpp(26) : error C2065: 'getPerson' : undeclared identifier
D:\vc++\MSDev98\MyProjects\PB_9_10\namesp.cpp(32) : error C2065: 'showPerson' : undeclared identifier
Error executing cl.exe.
Creating browse info file...

PB_9_10.exe - 2 error(s), 0 warning(s)
当把名称空间实现文件中的getPerson(rd.name);改为pers::getPerson(rd.name);
把showPerson(rd.name);改为pers::showPerson(rd.name);就可以编译通过且运行正常.debts名称空间中不是已经包含了pers名称空间了吗?怎么还要特别指出呢?
我用的vc++6.0
...全文
225 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmail 2007-05-15
  • 打赏
  • 举报
回复
用的VC6.0吧?VC这样不行.但是GCC就可以.问题就出来这里.不要用VC6.0来学C++.
你那样写其实是没有问题的.

namespace A
{
int a = 10;
}

namespace B
{
using namespace A;
}

namespace B
{
int b = a;
}

int main()
{
cout<<B::b<<endl;
return 0;
}
taodm 2007-05-15
  • 打赏
  • 举报
回复
可以用vc2005
xuyouqiang 2007-05-15
  • 打赏
  • 举报
回复
gcc我没有用过!好像是在linix下用的?
我的是windows.
可以用visual stdio 2005吗?
cmail 2007-05-14
  • 打赏
  • 举报
回复
namespace debts
{

using namespace pers;//再加上这句.

void getDebt(Debt & rd)
{
getPerson(rd.name);
std::cout<<"Enter debt: ";
std::cin>>rd.amount;
}
void showDebt(const Debt &rd)
{
showPerson(rd.name);
std::cout<<": $"<<rd.amount<<std::endl;
}

double sumDebts(const Debt ar[],int n)
{
double total = 0;
for(int i = 0;i<n;i++)
total+=ar[i].amount;
return total;
}
}
digu 2007-05-14
  • 打赏
  • 举报
回复
对于using指示符,起到的作用不是引入名字空间到当前所在的域中,而仅仅相当于是在定义名字空间的那个域中取消掉那个名字空间的{},C++ primer里面讲得很清楚。也可以到http://blog.csdn.net/digu/archive/2007/05/13/1606563.aspx看看。

64,649

社区成员

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

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