7
namespace X
{
  void* operator new (size_t);
}

次のようなエラーメッセージが表示されます。

error: ‘void* X::operator new(size_t)’ may not be declared within a namespace

それはgccコンパイラのバグですか?古いgccバージョンでは、機能しているようです。何か考え、なぜそれが許可されないのですか?

ユースケース:クラスのカスタムのみoperator new/deleteを許可し、グローバルを禁止したかったnew/operator。リンカエラーの代わりに、コンパイラエラーを簡単にキャッチできました。だから私はコーディングしました:

namespace X {
  void* operator new (size_t);
}
using namespace X;

これは古いバージョンのgccでは機能しましたが、新しいバージョンでは機能しませんでした。

4

2 に答える 2

11

意味がないため、これは許可されていません。たとえば、次のようなものがあります

int* ptr = 0;

namespace X {
    void* operator new (size_t);
    void operator delete(void*);
    void f()
    {
       ptr = new int();
    }
}

void f()
{
    delete ptr;
    ptr = 0;
}

では、どのようptrdeletedにする必要がありますか?グローバル名前空間operator delete()またはに固有の名前空間を使用しnamespace Xますか?C++がそれを推測する方法はありません。

于 2011-06-02T05:52:37.290 に答える
6

@ Sharptoothの回答は、このセクションを標準から検討すると、より理にかなっています。

3.7.3.1割り当て関数[basic.stc.dynamic.allocation]

[..]割り当て関数は、クラスメンバー関数またはグローバル関数でなければなりません。割り当て関数がグローバルスコープ以外の名前空間スコープで宣言されているか、グローバルスコープで静的に宣言されている場合、プログラムの形式が正しくありません。[..]

上記の制限は、@sharptoothの回答が指摘しているまさにその理由のためにおそらく課せられます。

于 2011-06-02T05:57:58.043 に答える