オーバーロード関数に関する制約
許容可能なオーバーロード関数のセットには複数の制限が適用されます。
一連のオーバーロードされた関数の 2 つの関数には、異なる引数リストが必要です。
オーバーロードは、戻り値の型だけに基づいて同じ型の引数リストと共に機能するエラーです。
Microsoft 固有の仕様 →
戻り値の型に基づいて (特に、指定したメモリ モデル修飾子に基づいて) のみ、operator new をオーバーロードできます。
END Microsoft 固有の仕様
メンバー関数は、静的である一方と静的でない他方に基づいてのみオーバーロードすることはできません。
typedef 宣言は、新しい型を定義しません。この宣言は、既存の型のシノニムを導入します。 オーバーロード メカニズムには影響しません。 次のコードがあるとします。
typedef char * PSTR; void Print( char *szToPrint ); void Print( PSTR szToPrint );
先行する 2 つの関数の引数リストはまったく同じです。 PSTR は、char * 型のシノニムです。 メンバーのスコープでは、このコードによりエラーが発生します。
列挙型は別個の型です。また、オーバーロードされた関数を識別するために使用できます。
型 "array of " と "pointer to" は、オーバーロード関数を識別する目的では同一と見なされます。 これは、単独で次元設定された配列だけに当てはまります。 したがって、次のオーバーロードされた関数は競合し、エラー メッセージを生成します。
void Print( char *szToPrint ); void Print( char szToPrint[] );
次元配列の乗算では、2 番目以降のすべてのディメンションは、型の一部と見なされます。 したがって、オーバーロードされた関数を識別するために使用されます。
void Print( char szToPrint[] ); void Print( char szToPrint[][7] ); void Print( char szToPrint[][9][42] );