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

大侠一个C++名字空间的有关问题

2012-03-09 
请教各位大侠一个C++名字空间的问题一共是三个文件,建议各位大侠,把它们先拷下来,放到机上跑一下,看看编译

请教各位大侠一个C++名字空间的问题
一共是三个文件,建议各位大侠,把它们先拷下来,放到机上跑一下,看看编译器的提示,我看不明白是什么问题。

//文件1 salesdefi.cpp

#include<iostream>
#include "sales.h"

using std::cout;
using std::cin;
using std::endl;
using namespace SALES;

void setSales(Sales &s, const double ar[], int n)
{
double maxtemp=ar[0], mintemp=ar[0], salessum=0;
for(int i=0;i<n;i++)
{
s.sales[i]=ar[i];
salessum+=ar[i];
if(ar[i]>maxtemp)
maxtemp=ar[i];
else if(ar[i]<mintemp)
mintemp=ar[i];
}
s.average=salessum/n;
s.max=maxtemp;
s.min=mintemp;
if(n<4)
for(int i=n;i<4;i++)
s.sales[i]=0;
}

void setSales(Sales &s)
{
double sum=0, maxtemp, mintemp;
for(int i=0;i<4;i++)
{
cout<<"Please enter the sales of #"<<i+1<<" quarter:";
cin>>s.sales[i];
sum+=s.sales[i];
if(i==0)
maxtemp=mintemp=s.sales[0];
if(s.sales[i]>maxtemp)
maxtemp=s.sales[i];
else if(s.sales[i]<mintemp)
mintemp=s.sales[i];
}
s.average=sum/4;
}

void showSales(const Sales&s)
{
cout<<"Sales#1Q:\t"<<s.sales[0]<<endl;
cout<<"Sales#2Q:\t"<<s.sales[1]<<endl;
cout<<"Sales#3Q:\t"<<s.sales[2]<<endl;
cout<<"Sales#4Q:\t"<<s.sales[3]<<endl;
cout<<"Average:\t"<<s.average<<endl;
cout<<"Max sales:\t"<<s.max<<endl;
cout<<"Min sales:\t"<<s.min<<endl;
}

//文件2 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);
}


//文件3 saletest.cpp

#include<iostream>
#include "sales.h"

using namespace SALES;

int main()
{
using namespace std;
//using namespace SALES;
Sales a, b;
double dar[4]={1234,345,4235,9432};
double dar2[3]={432, 32, 40};
setSales(a, dar, 4);//A
cout<<"Initializing a complete! Info of Sales a as follow:"<<endl;
showSales(a);//B
cout<<"Enter information of Sales b:"<<endl;
setSales(b);//C
showSales(b);//D,ABCD四行即使我加了SALES::的限定符仍然编译失败
}

感觉问题出在文件3中,可是就是不明白到底是什么问题,按编译器的提示应该是名字空间的问题,求各位大侠赐教,谢谢


[解决办法]
给你改了挺多 看注释 错的原因在下面
sales.h

C/C++ code
#ifndef SALES_H#define SALES_H#include <iostream>                    //将sales.h  与salesdefi.cpp的内容放在一起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);}void SALES::setSales(Sales &s, const double ar[], int n){double maxtemp=ar[0], mintemp=ar[0], salessum=0;for(int i=0;i<n;i++){s.sales[i]=ar[i];salessum+=ar[i];if(ar[i]>maxtemp)maxtemp=ar[i];else if(ar[i]<mintemp)mintemp=ar[i];}    s.average=salessum/n;    s.max=maxtemp;    s.min=mintemp;if(n<4)for(int i=n;i<4;i++)s.sales[i]=0;}void SALES::setSales(Sales &s){double sum=0, maxtemp, mintemp;for(int i=0;i<4;i++){std::cout<<"Please enter the sales of #"<<i+1<<" quarter:";    std::cin>>s.sales[i];sum+=s.sales[i];if(i==0)maxtemp=mintemp=s.sales[0];if(s.sales[i]>maxtemp)maxtemp=s.sales[i];else if(s.sales[i]<mintemp)mintemp=s.sales[i];}s.average=sum/4;}void SALES::showSales(const Sales&s){std::cout<<"Sales#1Q:\t"<<s.sales[0]<<std::endl;std::cout<<"Sales#2Q:\t"<<s.sales[1]<<std::endl;std::cout<<"Sales#3Q:\t"<<s.sales[2]<<std::endl;std::cout<<"Sales#4Q:\t"<<s.sales[3]<<std::endl;std::cout<<"Average:\t"<<s.average<<std::endl;std::cout<<"Max sales:\t"<<s.max<<std::endl;std::cout<<"Min sales:\t"<<s.min<<std::endl;}#endif 


[解决办法]
首先 你的结帖率太低了 ~~

1 第一个错误 你的 saletest.cpp并没有包含别一个源文件 ~ 注意文件名
2 头文件重定义 请添加头文件保护符 (#ifndef ...) 
3 函数定义没有加上限定符::不知道哪跑出来的函数 这里面又涉及到一个挺复杂的东西 下面讲
4 给函数添加了限定符之后 会发现说重复定义了(未将两文件合并之前)这是因为在sales已经定义了同样的函数了 (虽然你认为他是声明,而且实际你也只声明了,没有定义函数体)
5 给你说下第三点提到的问题 :

这个问题名称叫做 实参相依查找 (argument lookup lookup) 不知道网上有没有 你可以去搜下 
简单的说 就是你的函数里面的一个形参(parameter) 是在名空间里定义的 那么这个函数在考虑候选函数的时候 就会将这个空间定义的函数也给考虑进去 ~~ 到确定的时候(你在非main函数所在源文件定义了一个同名同形参的函数,虽然实际上他们不是同一个~~) 突然发现不能确定要选哪个函数 导致报错

热点排行