您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> C++名称空间问题

C++名称空间问题(1/2)

来源:网络整理     时间:2016/9/6 0:24:17     关键词:

关于网友提出的“ 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处理相关的片断。 C++名称空间问题

解决方案3:

引用 14 楼 visiual 的回复:
函数没什么问题,应该就是内部定义和外部定义两种形式把

你定义的不是外部函数(自由函数),而是成员函数
需要 类(结构名)加 :: 的方式定义
成员函数,在结构(类) 内部,不需要类型名::这种方式
结构(类)外部,需要 结构(类)名::函数名这种方式定义
这里有一个 名空间,问题
一个 结构的成员函数问题
是两个问题
第一种方式
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:
这个没试验过,不保证能成功

相关图片

相关文章