首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于名称空间的有关问题

2012-03-23 
关于名称空间的问题头文件://namesp.h//createthepersanddebtsnamespacesnamespacepers{constintLEN40st

关于名称空间的问题
头文件:
//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

[解决办法]
对于using指示符,起到的作用不是引入名字空间到当前所在的域中,而仅仅相当于是在定义名字空间的那个域中取消掉那个名字空间的{},C++ primer里面讲得很清楚。也可以到http://blog.csdn.net/digu/archive/2007/05/13/1606563.aspx看看。
[解决办法]
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;
}
}
[解决办法]
用的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;
}

热点排行