我在 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
从函数的定义中删除关键字,它也会消失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 可以是两个参数的函数而不是三个参数的函数的原因。
所以这里简单总结一下消除错误的三种方法:
删除
using namespace std;
线。从 的定义中删除
const
关键字find
。删除函数的第三个参数
find
。
我想不出任何合乎逻辑的原因为什么会首先发生这样的错误,以及为什么应该删除它我使用上述任何看似完全不相关的步骤。这是一个记录在案的 g++ 错误吗?我尝试搜索它,但老实说,我不知道要搜索什么,而且我尝试的几个关键字(“没有使用 STL 的 STL 错误”)没有出现任何内容。