2

我在 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 可以是两个参数的函数而不是三个参数的函数的原因。

所以这里简单总结一下消除错误的三种方法:

  1. 删除using namespace std;线。

  2. 从 的定义中删除const关键字find

  3. 删除函数的第三个参数find

我想不出任何合乎逻辑的原因为什么会首先发生这样的错误,以及为什么应该删除它我使用上述任何看似完全不相关的步骤。这是一个记录在案的 g++ 错误吗?我尝试搜索它,但老实说,我不知道要搜索什么,而且我尝试的几个关键字(“没有使用 STL 的 STL 错误”)没有出现任何内容。

4

2 回答 2

3

您只是发生了冲突,因为您无意中将std::find(需要 3 个参数)拉到全局命名空间中using namespace std;。无论出于何种原因,您的<iostream>is #include-ing<algorithm>或其内部实现的一部分(特别是bits/stl_algo.h)。

我无法解释为什么删除const会使它消失;也许它会影响编译器解决重载的顺序。

于 2012-06-05T20:05:45.000 回答
0

您将编译器与标准库 (std::find) 中的 find 版本混淆了,该版本具有 3 个参数,但不是您拥有的参数。

如果您的代码位于其自己的命名空间中,则可以避免此问题。或者通过重命名你的 find 方法,或者你已经记录的解决方案。

于 2012-06-05T20:05:23.327 回答