Cygwinでgcc 3.4.4を使用しています。以下の私のコードでは、STL をまったく使用していない、かなり厄介な STL エラー メッセージが表示されます。
#include <iostream>
using namespace std;
const int N = 100;
bool s[N + 1];
bool p[N + 1];
bool t[N + 1];
void find(const bool a[], bool b[], bool c[]){
return;
}
int main(){
find(s, p, t);
return 0;
}
g++ stack.cc でコンパイルすると
次のエラー メッセージが表示されます。
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h: In function `_RandomAccessIterator std::find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = bool*, _Tp = bool[101]]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:314: instantiated from `_InputIterator std::find(_InputIterator, _InputIterator, const _Tp&) [with _InputIterator = bool*, _Tp = bool[101]]'
stack.cc:18: instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:207: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:211: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:215: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:219: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:227: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:231: error: ISO C++ forbids comparison between pointer and integer
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:235: error: ISO C++ forbids comparison between pointer and integer
ご覧のとおり、コードは STL をまったく使用していないため、これはかなり奇妙です。また、行を削除するとエラーが消えます
using namespace std;
これは、名前空間の衝突を示唆しています。const
function の定義からキーワードを削除すると、それも消えますfind
。
一方、次のように2引数の関数を作成すると、エラーも消えます(これはかなり驚くべきことです) 。find
#include <iostream>
using namespace std;
const int N = 100;
bool s[N + 1];
bool p[N + 1];
bool t[N + 1];
void find(const bool a[], bool b[]){
return;
}
int main(){
find(s, p);
return 0;
}
find が2つの引数の関数になり得るが、3つの引数の関数ではない理由が何であるか想像できません。
エラーを削除する 3 つの方法の簡単な要約を以下に示します。
行を削除し
using namespace std;
ます。const
の定義からキーワードを削除しfind
ます。関数の 3 番目の引数を削除します
find
。
なぜそのようなエラーが最初に発生するのか、なぜそれを削除する必要があるのか 、論理的な理由は考えられません.上記の一見完全に無関係な手順のいずれかを使用します. これは文書化された g++ バグですか? 探してみたのですが、正直なところ何を探せばいいのか途方に暮れ、いくつか試したキーワード(「STLを使わないSTLエラー」)では何もヒットしませんでした。