关于网友提出的“ C++名称空间问题”问题疑问,本网通过在网上对“ C++名称空间问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: C++名称空间问题
描述: 楼主新手,今天编程序的时候遇到个问题,就是这个Sales名称空间,当在sales.cpp中直接声明using namespace SALES时,程序会显示无法解析的外部命令,应该是无法引用成员函数,但用作用域解析符却正常运行输出,这是什么原因?程序如下:
#ifndef SALES_H
#define SALES_H
namespace SALES
{
const int QUARTERS=4;
struct Sales
{
double sales[QUARTERS];
double average;
double max;
double min;
};
void setSales(Sales &s,const double ar[],int n);
void setSales(Sales &s);
void showSales(const Sales &s);
}
#endif
//sales.cpp
#include
#include "student.h"//在这儿声明using namespace SALES;会出错
using std::cout;
using std::endl;
void SALES::setSales(Sales &s,const double ar[],int n)
{
int i;
double sum=0;
s.max=ar[0];s.min=ar[0];
for(i=0;i<>
{
s.sales[i]=ar[i];
sum+=ar[i];
if(s.max<>
s.max=ar[i];
if(s.min>ar[i])
s.min=ar[i];
}
s.average=sum/i;
}
void SALES::setSales(Sales &s)
{
cout<<"Enter "<<>
double ar[QUARTERS];
double sum=0;
int i;
for(i=0;i<>
{
std::cin>>ar[i];
s.sales[i]=ar[i];
sum+=ar[i];
}
s.average=sum/i;
s.max=s.min=ar[0];
for(i=0;i<>
{
if(s.max<>
s.max=ar[i];
if(s.min>ar[i])
s.min=ar[i];
}
}
void SALES::showSales(const Sales &s)
{
for(int i=0;i<>
{
cout<<"Sales: "<<><>
}
cout<<"Average: "<<><>
cout<<"Max: "<<><>
cout<<"Min: "<<><>
}
//main.cpp
#include "student.h"
#include
using namespace SALES;
int main()
{
Sales s1,s2;
double ar[QUARTERS]={1.1,2.2,3.3,4.4};
setSales(s1,ar,QUARTERS);
showSales(s1);
setSales(s2);
showSales(s2);
return 0;
}
解决方案1: 你的"student.h"中引入了sales.h这个头文件吗?如果没有,那么你在这儿声明using namespace SALES;一般就会找不到对SALES这个名字空间的声明,所以会报错。当然,如果你在引入student.h之前就已经引入了sales.h则也有可能没问题。
解决方案2: 闲来无事,可以参考一下gcc或g++源代码中和namespace处理相关的片断。
解决方案3:
你定义的不是外部函数(自由函数),而是成员函数
需要 类(结构名)加 :: 的方式定义
成员函数,在结构(类) 内部,不需要类型名::这种方式
结构(类)外部,需要 结构(类)名::函数名这种方式定义
这里有一个
名空间,问题
一个 结构的
成员函数问题
是两个问题
第一种方式
namespace SALES //名空间的定义
{
。。。。。
Sales:: // //结构(类)的名字
setSales ////成员函数名
......
}
第二种方式
using namespace SALES;///开放名空间
。。。。
Sales:: // //结构(类)的名字
setSales ////成员函数名
。。。。。
第三种方式
。。。。。
SALES:://名空间的名字
sales:: //结构(类)的名字
setSales //成员函数名
。。。。。
解决方案4:头文件
///sales.h ///可能的话,头文件和实现文件名要一致
#ifndef SALES_H
#define SALES_H
namespace SALES
{
const int QUARTERS=4;
struct Sales
{
double sales[QUARTERS];
double average;
double max;
double min;
};
void setSales(Sales &s,const double ar[],int n);
void setSales(Sales &s);
void showSales(const Sales &s);
};
}
#endif
实现文件//sales.cpp ///可能的话,头文件和实现文件名要一致
#include
///#include "student.h"//在这儿声明using namespace SALES;会出错
using std::cout;
using std::endl;
#include"sales.h" //注意,你用到那个头文件,包含哪个
using nakespace SALES; //"sales.h" 这个头文件中,struct Sales 定义在名空间内,
//开放名空间后,可以看到 Sales 这个 struct
//这样,函数名不需要,加上名空间的名字
//但是结构本身的名字,还是要加上的
//...........估计这种写法,也同样不被推荐,
// 因为
//uing namespace std;
//都已经不推荐了
void Sales::setSales(Sales &s,const double ar[],int n)
{
int i;
double sum=0;
s.max=ar[0];s.min=ar[0];
for(i=0;i<>
{
s.sales[i]=ar[i];
sum+=ar[i];
if(s.max<>
s.max=ar[i];
if(s.min>ar[i])
s.min=ar[i];
}
s.average=sum/i;
}
void Sales::setSales(Sales &s)
{
cout<<"Enter "<<>
double ar[QUARTERS];
double sum=0;
int i;
for(i=0;i<>
{
std::cin>>ar[i];
s.sales[i]=ar[i];
sum+=ar[i];
}
s.average=sum/i;
s.max=s.min=ar[0];
for(i=0;i<>
{
if(s.max<>
s.max=ar[i];
if(s.min>ar[i])
s.min=ar[i];
}
}
void Sales::showSales(const Sales &s)
{
for(int i=0;i<>
{
cout<<"Sales: "<<><>
}
cout<<"Average: "<<><>
cout<<"Max: "<<><>
cout<<"Min: "<<><>
}
主程序或者叫测试代码//main.cpp
///#include "student.h" //student.h 跟 sales.cpp,跟 struct Sales 有关系吗?
#include "sales.h" ///可能的话,头文件和实现文件名要一致
#include
using namespace SALES;
int main()
{
Sales s1,s2;
double ar[QUARTERS]={1.1,2.2,3.3,4.4};
setSales(s1,ar,QUARTERS);
showSales(s1);
setSales(s2);
showSales(s2);
return 0;
}
解决方案5: 你写的函数,是struct 的函数
所以必须在 名空间,和函数名之间,加上结构名
另外这样写,并不保险,当然,现在的编译器 这么做的话,是没有问题的
解决方案6: 自定义名空间的方法。
1)先 不管名空间,创建一些函数,类型定义,常量定义,等等
2)把这些东西,分成一些 .h,.cpp
3) 编译通过,运行正常
4) 在头文件中,除了,头文件包含指令,以及自己的包含保护的代码外
全部放在名空间内部
即 开有加上 namespace XXX{
结尾加上 }
5)对 .cpp 包含 名空间对应头文件的代码 放在 名空间外部
剩下的代码,如法炮制
也在开头加上
namespace XXX{
结尾加上
}
6) 重新编译 代码,测试一番
7) 把自己的代码打包成库文件,可以在测试一下(基本上是多余的)。
8)成功创建自己的名空间,结束
解决方案7: 只有全部名空间内部的定义,(都)实现了(主要针对函数)。。。。起码,跟对应名字关联的 东西,实现了
名空间打开,才能见到其中的名字。
你的SALES名空间内部的那个类sales 的成员函数,定义不正确。
你到哪里,using namespace SALES去,
即便 using 没问题,
using 了,这个 类的定义,还是不正确。
解决方案8: 类的实现也要放到名称空间中
解决方案9: 另外据说定义名空间内声明名字,C++1X中,可以用名空间名加上:: 定义,
不过也和你的做法不同
应该这么写:
void
SALES:: //名空间名字
Sales:: //类名字
setSales //成员函数名字
(Sales &s,const double ar[],int n)
{
int i;
double sum=0;
s.max=ar[0];s.min=ar[0];
for(i=0;i<>
{
s.sales[i]=ar[i];
sum+=ar[i];
if(s.max<>
s.max=ar[i];
if(s.min>ar[i])
s.min=ar[i];
}
s.average=sum/i;
}
PS:
这个没试验过,不保证能成功