我在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可以是两个参数函数而不是三个参数的原因。
以下是删除错误的三种方法的简要总结:
删除using namespace std;
行。
从const
的定义中删除find
关键字。
删除函数find
的第三个参数。
我想不出为什么这样的错误应该首先发生的任何逻辑上的原因,以及为什么它应该被删除我使用上述任何看似完全不相关的步骤。这是一个记录的g ++错误吗?我试着搜索它,但说实话,我不知道要搜索什么,我尝试的几个关键字(“没有使用STL的STL错误”)没有出现任何问题。
答案 0 :(得分:3)
您只是碰撞,因为当您执行std::find
时,您无意中将using namespace std;
(需要3个参数)拉入全局命名空间。无论出于何种原因,您的<iostream>
为#include
- <algorithm>
,或其内部实施的一部分(具体为bits/stl_algo.h
)。
我无法解释为什么删除const
会让它消失;也许它会影响编译器解决重载的顺序。
答案 1 :(得分:0)
您将编译器与标准库(std :: find)中的find版本混淆,后者有3个参数,但不是您拥有的参数。
如果您的代码位于自己的命名空间中,则可以避免此问题。或者通过重命名您的查找方法或您已记录的解决方案。