このプログラムを検討してください。
line#
1 #include <string>
2
3 using namespace std;
4
5 struct string { const char* p; }; // Beware: another string!
6
7 int main()
8 {
9 string x; // Error: ambiguous - which string is wanted?
10 }
コンパイルしようとすると、エラーが表示されます。
g++ using.cc -o using
using.cc: In function `int main()':
using.cc:9: error: use of `string' is ambiguous
using.cc:5: error: first declared as `struct string' here
/usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stringfwd.h:60: error:
also declared as `typedef struct std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::string' here
using.cc:9: error: `string' was not declared in this scope
using.cc:9: error: expected `;' before "x"
ここでの問題は、をmain()
指定するときstring x;
に、コンパイラがユーザー定義::string
またはインクルードのどちらが必要かわからないことstd::string
です。
ここで、プログラムの上部を取り、1行目から5行目までをstruct string
...までと、それをヘッダーファイルに入れて、その#include
前に配置するとしますmain()
。何も変わりません。まだエラーがあります。したがって、スタンドアロンプログラムの場合と同様に、using
ステートメントを含むヘッダーファイルは、それらを含む他のコードで問題を引き起こし、ステートメントの一部をあいまいにする可能性があります。
ただし、ヘッダーは、直接または間接的に、任意に大量の依存コードによって含めることができるため、より大きな問題になる可能性があります。
using
ヘッダーからステートメントを削除する、または
- の内容の変更
<string>
、または影響を与えるその他のヘッダーstd::
...問題のあるヘッダーを含むコードを壊す可能性があります。どちらの問題も依存コードをコンパイルできなくする可能性があり、別のコンパイルが試行されるまで問題に気付かない可能性があります。さらに、ステートメントが原因で苦しんでいる人は、ヘッダーからステートメントを削除したり、影響を受けた他のクライアントコードを修正using
したりするためのファイルシステム/コードリポジトリの権限、企業権限などを持っていない可能性があります。using
とはいえ、ヘッダーがクラスまたは関数内でのみ「使用」している場合、そのスコープを超えるコードには影響がないため、std::への変更による潜在的な影響は大幅に減少します。