0

Xあるタイプのメモリプールを使用するために、新しい演算子をオーバーロードしました。私のnew演算子はユーザー定義の引数を取りません。したがって、唯一の引数はタイプのオブジェクトのサイズですsize_t。プログラムの別の部分では、次のように、同じタイプの新しい配置が必要です。

new (ptr) X();

(ここで、ptrは事前に割り当てられたメモリ位置へのポインタです)

タイプシャドウ配置の新しい演算子のオーバーロードが新しいようです。少なくとも、コンパイラは次のように文句を言います。

error: no matching function for call to ‘X::operator new(long unsigned int, X*&)’
note: candidate is:
note: static void* X::operator new(size_t)
note:   candidate expects 1 argument, 2 provided

候補は、新しい演算子の私の過負荷です。私の質問は次のとおりです。

  • 新しい配置を使用したいことをコンパイラが認識しないのはなぜですか?
  • とにかくそれをどのように使用できますか?
  • WTFはX*&エラーメッセージに表示されるタイプですか?
4

1 に答える 1

2

TypeName :: operator new(size_t)をオーバーライドするには、配置のnew演算子もオーバーライドする必要があります(反対は必要ありません)。コンパイラが文句を言っているのはそのためです。(意味があります-割り当て中に何か奇妙なことをしている場合は、配置の新しい演算子の指定された場所でもそれを行うことができますが、その逆は必ずしも当てはまりません)。また、X *&は、新しいオブジェクトが必要なポインタへの単なる参照です。

于 2012-08-31T12:13:51.127 に答える