读书人

关于名称空间的有关问题

发布时间: 2012-03-23 12:06:21 作者: rapoo

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

读书人网 >C++

热点推荐