#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
class div
{
int x,y;
public:
class dividebyzero
{
};
class noerror1
{
};
div(){};
div(int a,int b)
{
x=a;
y=b;
}
void error1()
{
if(y==0)
throw dividebyzero();
else
throw noerror1();
}
int divide()
{
return (x/y);
}
};
class naming
{
char name[32];
public:
class nullexception
{
};
class noerror2
{
};
naming(char a[32])
{
strcpy(name,a);
}
void error2()
{
if(strcmp(name,"")==0)
throw nullexception();
else
throw noerror2();
}
void print()
{
cout<<"Name-----"<<name<<endl;
}
};
int main()
{
div d(12,0);
try
{
d.error1();
}
catch(div::dividebyzero)
{
cout<<"\nDivision by Zero-------Not Possible\n";
}
catch(div::noerror1)
{
cout<<"\nResult="<<d.divide()<<endl;
}
naming s("Pankaj");
try
{
s.error2();
}
catch(naming::nullexception)
{
cout<<"\nNull Value in name\n";
}
catch(naming::noerror2)
{
s.print();
}
return 0;
}
在编译此程序时,我收到以下错误
pllab55.cpp: In function ‘int main()’:
pllab55.cpp:61:6: error: expected ‘;’ before ‘d’
pllab55.cpp:64:3: error: ‘d’ was not declared in this scope
pllab55.cpp:72:22: error: ‘d’ was not declared in this scope
pllab55.cpp:74:20: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
在声明类命名之前,一切运行正常。在声明命名之后,这些错误开始发生。我是C ++的新手。请详细解释我。提前谢谢。
答案 0 :(得分:2)
标准命名空间中已经有 std::div ,因为您使用using namespace指令而不是声明它将std
命名空间中的所有符号导入当前范围。因此,重命名div
类可能会为您解决问题。
我尝试重命名它, work indeed 。
因此要么重命名你的类,要么将它包装在你自己的命名空间中,这样它就不会与std::div
冲突
答案 1 :(得分:2)
您的类div与std :: div共享同一个名称。当您执行#using namespace std时,结果是std命名空间中的每个类都被导入到当前范围中,这意味着std :: div现在基本上称为div。如果你看到,这意味着你现在有两个在同一范围内称为div的类,你自己的和std类。
顺便说一下,你应该避免使用命名空间语法,而是使用类的完整限定符(例如std :: cout)。
答案 2 :(得分:0)
您的div
类与std::div
冲突,因此要么重命名您的,要么将您的div类放在不同的命名空间中。
namespace me {
struct div{};
}
me::div d;
答案 3 :(得分:0)
我在gcc中尝试了你的代码(稍微变了一下),我收到了以下错误:
/usr/include/stdlib.h:780: error: too few arguments to function 'div_t div(int, int)'
你正试图从标准库中覆盖一个名称,并且遇到类和具有相同名称的函数的冲突,我担心。
答案 4 :(得分:0)
作为一般经验法则,如果遇到此类问题,请尝试尽可能减少代码。例如,我把它减少到了
#include<stdlib.h>
class div {
public:
div (int a, int b) { }
};
int
main () {
div d (12, 0);
return 0;
}
仍显示您的错误(至少第一个 - 其他是后续错误)。 这使您可以减少关于错误原因的可能假设 - 如您所见,您的新类“命名”不必对您看到的错误执行任何操作。 当我现在另外删除include时,错误不再显示,这让我怀疑某些命名与stdlib.h中的符号发生冲突。将“div”类重命名为其他东西(如“CDiv”)后,它就可以了。