0

「オブジェクト アロケータ」関数を渡すことができ、テンプレート オブジェクトの演算子 new() をデフォルトの引数として受け取るクラスを定義しようとしています。次のコードがあります。

template<class _Obj>
class Foo
{
private:
    typedef _Obj (_Obj::*fp_alloc_type)();

public:
    Foo(fp_alloc_type t=_Obj::operator new ());

...
};

これにより、comiler エラー C2039: 'new' : is not a member of 'SomeObj' が発生します。

コンパイラは、独自に定義していないオブジェクトに対して 'new' のデフォルトの実装を生成しませんか? 何か不足していますか?

4

1 に答える 1

0

それが何であれ、operator new関数 はどのクラスの非静的メンバー関数でもありませんクラス固有の演算子 new を宣言して定義しても、静的メンバー関数と見なされます。単一のsize_t 引数を取る場合、それへのポインターは になりますvoid* (*ptrToNew)( size_t )。(もちろん、配置が新しい場合は、より多くの引数があります。)

を実行するnew Fooと、コンパイラは operator new最初に のスコープでFoo(Fooがクラス型の場合)、次にグローバル名前空間で名前の検索を行います。(興味深いことに、コンパイラはが宣言されている名前空間を検索しませんFoo。また、ADL も適用されません。operator newグローバル名前空間以外の名前空間の関数は決して見つかりません。)operator newクラスで an を宣言していない限り、グローバルoperator new関数が使用されます。

于 2013-03-28T13:52:12.053 に答える