0

次の C++11 プログラムを検討してください。

 #include <stdhdr1>
 #include <stdhdr2>
 #include <stdhdr3>

 using namespace std;

 #include <boost1>
 #include <boost2>
 #include <boost3>

 int main()
 {
 }

stdhdrnは標準ライブラリ ヘッダー、はboostnブースト ヘッダーです。

これがコンパイルされない状況はありますか?

さらに、メインに追加のユーザー コードがある場合、あいまいな (またはエラーのある) エンティティを明示的に修飾することによって解決できない std 名前空間を開くことによって引き起こされるあいまいさ (またはその他のエラー) はありますか?

(たとえば、ADL がオープンな std 名前空間を考慮しているなどの理由でしょうか?)

(別の言い方をすれば、開いている std 名前空間の後に含まれているハンドルを後押しできますか?)

4

1 に答える 1

4

stdには名前空間が含まれていないため、問題が発生するとは思わboostないため、名前の競合は発生しません。

ADL に関して: ADL は、クラス型の外側の名前空間のみを考慮します。ブースト クラス型の ADL によって検出されるすべての関数は、boost名前空間内のどこかにある必要があります。

::std_entity標準ライブラリ エンティティとboost::boost_entityブースト エンティティに対して行うだけで、すべてのエンティティを解決できます。

ただし、明示的に試してみないと、これを証明する良い方法は思いつきません。もちろん、問題を回避する確実な方法は、実行しないことusing namespace std;です。実際に実行する必要がある場合 (実行しない場合) は、すべてを含めた後にのみ実行してください。

于 2013-02-21T19:31:14.963 に答える