2

この質問のフォローアップとしてこれを尋ねています。前の質問はほぼ3年前に尋ねられたので、新しい質問をする方が良いと思います.

私がリンクしたその質問の核心は、OPが次のコード行を実行しようとしたことです:

find_if(s.begin(), s.end(), isalnum);

いくつかのコンテナsで。コード行のコンパイルに失敗しました。OP はこれを実行する必要がありました

find_if(s.begin(), s.end(), ::isalnum);

locale受け入れられた回答は、 ライブラリとライブラリに isalnum 関数がありcctype、コンパイラが 2 つの間のあいまいさを解消するのに問題があるため、::スコープ解決演算子であると述べています。これらのライブラリの 1 つだけを含めてテストしましたが、コンパイラにはまだあいまいさを解消する問題があります。何故ですか?これらのライブラリの 1 つだけを含めた場合、明らかにコンパイラは他のライブラリについて「認識」してはならないので、なぜ競合するのでしょうか?

私の質問の 2 番目の部分は、オペレーターが必要な機能をどのように::教えてくれるのかということです。isalnum

ありがとう

編集

::演算子が、必要な関数/変数がグローバル スコープにあることを教えてくれることは知っていますが、それでも私の 2 番目の質問には答えていません。

4

2 に答える 2

3

isalnumfromは<locale>namespace で定義されていますstdisalnumfrom<cctype>は名前空間std グローバルに定義されます。これは、C ライブラリのシンボルが (おそらく [1]) グローバル スコープで使用できるようになっているためです。を使用すると、 からではなく、グローバル スコープから::isalnumのバージョンが要求されます。isalnumnamespace std

[1]。標準では、含める<ctype.h>場合、シンボルがグローバルスコープになることが保証されています。C ライブラリ ヘッダーの場合、これはほとんどの場合、cc*バージョンにも当てはまりますが、厳密には実装定義です。

于 2015-09-21T13:36:36.240 に答える