STL错误_without_代码中的任何STL

时间:2012-06-05 20:01:57

标签: c++ namespaces g++ cygwin using

我在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关键字,它也会消失。

另一方面,如果我使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的第三个参数。

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

2 个答案:

答案 0 :(得分:3)

您只是碰撞,因为当您执行std::find时,您无意中将using namespace std;(需要3个参数)拉入全局命名空间。无论出于何种原因,您的<iostream>#include - <algorithm>,或其内部实施的一部分(具体为bits/stl_algo.h)。

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

答案 1 :(得分:0)

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

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