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 という名前の 2 つのクラス、独自のクラスと std クラスがあることを意味します。

ところで、名前空間構文の使用は避け、クラスの完全な修飾子 (std::cout など) を使用する必要があります。

于 2012-08-20T07:12:41.140 に答える
2

標準名前空間には既にstd::divがあり、宣言の代わりに using 名前空間ディレクティブを使用するため、名前空間内のすべてのシンボルが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 に答える