3

今日、いくつかのコードが送られてきました。それは std::string で std::transform を使用してすべて小文字にしています。送信者は、Visual Studio 2010 でコードを作成してコンパイルしました。

using namespace std;
string test = "TEST";
transform(test.begin(), test.end(), test.begin(), tolower);

OSxでGCCやClangを使用してコンパイルしたところ、名前空間の衝突が発生するため、コンパイルエラーが発生しました。

確かに、グローバル名前空間とローカル (::tolower と std::tolower) に対処する回答済みの質問がたくさんありますが、これは、このコードが実際に VS で機能するという事実に関するものです。

回答が欲しい質問:

  1. Visual Studio がこれをコンパイルするのはなぜですか?
  2. std:: を優先する必要があるのに、グローバル名前空間 :: にデフォルト設定 (?) するのはなぜですか?

注:OSx Mountain LionでGCC 4.2とClang(425.0.24 LLVM 3.2svn)を使用しています

4

1 に答える 1

1

ここでの問題は2つあります。まず、特に指定しないと、関数ではなくマクロで#include <cctype>ある可能性がありtolowerます(ただし、これが最近の問題であるかどうか、およびこれが標準への準拠に違反するかどうかはわかりません)。

第二に、C++ではtolowerオーバーロードされています。使用する特定のオーバーロードを選択する必要があります。

transform(test2.begin(), test2.end(), test2.begin(),
          static_cast<int(*)(int)>(tolower));

std::しかし、オーバーロードされたバージョンを取得し、取得しない理由はわかり::ません。いずれにせよ、これらのC関数から離れて、代わりにヘッダーstd::ctypeから使用することをお勧めします。<locale>tolower

http://www.cplusplus.com/reference/locale/ctype

于 2013-02-22T12:42:53.737 に答える