1
#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++ 新手。请详细解释我。提前致谢。

4

5 回答 5

2

您的类 div 与 std::div 同名。当你执行#using namespace std 时,结果是std 命名空间中的每个类都被导入到你当前的作用域中,这意味着std::div 现在基本上被称为div。如果您看到,这意味着您现在在同一范围内有两个名为 div 的类,即您自己的类和 std 类。

顺便说一句,您应该避免使用命名空间语法,而是使用类的完整限定符(例如 std::cout)。

于 2012-08-20T07:12:41.140 回答
2

标准命名空间中已经有一个std::div,并且由于您使用 using namespace 指令而不是声明,它将std命名空间中的所有符号导入到当前范围。因此,也许重命名div课程会为您解决问题。

我尝试重命名它,它确实有效

所以要么重命名你的类,要么将它包装在你自己的命名空间中,这样它就不会与std::div

于 2012-08-20T07:02:16.383 回答
0

您的类与您的div类冲突,std::div因此要么重命名您的类,要么将您的 div 类放在不同的命名空间中。

namespace me {
   struct div{};
}

me::div d;
于 2012-08-20T07:04:49.277 回答
0

我在 gcc 中尝试了您的代码(稍微变体),但出现以下错误:

 /usr/include/stdlib.h:780: error: too few arguments to function 'div_t div(int, int)'

恐怕您正试图覆盖标准库中的名称并遇到类和具有相同名称的函数的冲突。

于 2012-08-20T07:07:44.510 回答
0

作为一般经验法则,如果您遇到此类问题,请尽量减少您的代码。例如,我把它减少到

#include<stdlib.h>

class div {
public:
  div (int a, int b) { }
};

int
main () {
  div d (12, 0);
  return 0;
}

它仍然显示您的错误(至少是第一个错误 - 其他是后续错误)。这还可以让您减少对错误原因的可能假设 - 如您所见,您的新类“命名”不必对您看到的错误做任何事情。当我现在另外删除包含时,错误不再出现,这让我怀疑与 stdlib.h 中的某些符号存在命名冲突。将类“div”重命名为其他名称(如“CDiv”)后,它就可以工作了。

于 2012-08-20T07:15:02.803 回答