2016-08-03 5 views
1

標準ライブラリ関数のいずれかと正確に一致する関数の名前を使用して、変換単位内に関数を定義するとします。 コンパイラは最初に翻訳単位の定義を探してからライブラリファイルを探しますが、これは関数定義の独自のバージョンを使用するか、それとも診断の原因になりますか?C++は標準ライブラリ関数名も予約していますか?

+5

これは、std名前空間を使用して '使用の症状のように聞こえます;'。あなたがそれを使用しているなら、[しばらくお待ちください](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered-bad-practice)。 – NathanOliver

+0

独自の名前空間を使用する場合は、stl関数名を再利用できます。例えば'mynamespace {ostream&cout(String str)}}'。次に、スコープ解決演算子(::)を使用して名前空間を使用して、使用するcoutを指定します。 – pjcognetta

+0

'std'名前空間に新しいシンボルを導入する場合とまったく同じですか?これは明示的に§17.6.4.2.1で禁止されています:* "プログラムの動作は、宣言や定義を名前空間' std' *に追加すると未定義です。ただし、テンプレートをユーザータイプに特化することは許可されています。 – peppe

答えて

2

いいえ、名前空間std内の関数の名前は予約されていません。少なくとも、名前空間std以外の同じ名前を使用することは禁止されていません。

しかし、名前空間std内に名前を配置すると(特定のテンプレート関数を特殊化するなどの場合を除いて)、未定義の動作が発生します。あなたは機能の一つは、あなたと同じ名前を持っていますが、名前空間stdであるあなたの関数を呼び出す際に曖昧に文句コンパイラを取得している場合は

は、その原因はおそらく、あなたのコードでusing namespace stdです。コンパイラが名前に遭遇したときのその影響は、関数とネームスペースstdの関数の両方が有効なマッチであることです。コンパイラが他のものよりも優先させる理由がない場合(例えば、同じ型の引数を受け入れる場合)、コードはコンパイルされません。その場合、解決策はコードからusing namespace stdを削除することです。削除する以外にusing namespace stdの効果を元に戻す方法はありません。

2

私は(私が間違っているなら、私を修正)が正しく質問を理解していますが、そうのような機能を持っていると言うのかはわからない:

void sort(// blah blah 

またはstd名前空間にusing namespace std(which you should not be doing)

を宣言翻訳単位内でsort(...)を呼び出すと、コンパイラは定義をオーバーロードします。この場合、関数が優先されます。

しかし、あなたは明示的ではなく、STDライブラリ関数を使用しますので、

std::sort(// blah blah 

のような(スコープ解決演算子を使用して)std名前空間を定義することによって、標準ライブラリ関数を呼び出す場合。

+0

@HolyBlackCatなぜ 'putchar'がこの動作をしているのか分かりませんが、あなたのコードは動作しません。http://ideone.com/EXJ50Iを参照してください。 – Holt

+1

標準ライブラリには特別な優先順位はありません。 'std'の' sort'が 'using namespace std'で引かれ、' sort'という名前のユーザ定義関数がある場合、通常のオーバーロード規則が適用されます。 –

+0

@ialcuaz - いいえ、それは正しくありません。コンパイラは、呼び出しの時点でオーバーロードを処理し、スコープ内にあるすべての宣言を調べます。彼らがどのようにそこに着いたかは関係ありません。 –

0

これは、人々がusing namespace std;をC++で使用することが悪いことだと言う理由です。

namespace stdの内部ですでに定義されている同じ関数名を使用すると、関数定義が競合するため、多くの無関係なエラーが発生します。

詳細については、このスレッドを読む: -

Why using namespace std; in C++ is considered a bad practice?

関連する問題