C++ STL错误u代码中没有任何STL

C++ STL错误u代码中没有任何STL,c++,namespaces,g++,cygwin,using,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(){ f

我在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;
}
如您所见,代码根本不使用任何STL,因此这相当奇怪。此外,如果我删除该行,错误也会消失

using namespace std;
这暗示了一些名称空间冲突。如果我从函数
find
的定义中删除
const
关键字,它也会消失

另一方面,如果我将
find
设置为2参数函数,则错误也会消失(这相当令人惊讶):

#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;
}
#包括
使用名称空间std;
常数int N=100;
布尔s[N+1];
boolp[N+1];
布尔t[N+1];
无效查找(常量布尔a[],布尔b[]{
返回;
}
int main(){
发现(s,p);
返回0;
}
我无法想象为什么find可以是两个参数的函数而不是三个参数的函数

下面简要总结了消除错误的三种方法:

  • 使用名称空间std删除

  • find
    的定义中删除
    const
    关键字

  • 删除函数
    find
    的第三个参数


  • 我想不出任何逻辑上的原因,为什么这样的错误会发生在第一位,为什么它应该被删除,我使用任何上述看似完全无关的步骤。这是一个记录在案的g++错误吗?我试着搜索它,但老实说,我不知道该搜索什么,我尝试的几个关键词(“没有使用STL的STL错误”)也没有找到任何结果

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


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

    您只是发生了冲突,因为您在使用命名空间std时无意中将
    std::find
    (包含3个参数)拉入了全局命名空间。无论出于何种原因,您的
    #包括
    -ing
    ,或其内部实现的一部分(具体地说,
    bits/stl\u algo.h


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

    谢谢,这就解释了这一点。虽然我仍然不明白为什么
    算法
    会被
    iostream
    @CirceMagnifica包括在内:我也是。不过,我不认为标准禁止这样做。它绝对可以这样做。在我看来,关键是
    使用名称空间std
    是一个不好的习惯。此外,可能没有
    常量的版本工作的原因是,正如我在下面的另一条评论中所说的:
    std::find
    所需的
    inputierator
    类型将与非常量指针匹配,但与
    const
    指针不匹配?当您具有
    const
    时,调用函数需要两个转换:数组到指针(
    bool[101]
    ->
    bool*
    ),然后进行资格转换(
    bool*
    ->
    const bool*
    )。
    std::find
    的模板参数被推导为完全匹配,因此不需要转换。(数组到指针和限定调整转换都被列为精确匹配,但如果您需要多个IIRC,则不列为精确匹配。)删除
    常量后,不需要第二次转换;你有一个数组到指针的精确匹配,它比模板精确匹配更可取,因为它不是一个模板。是的,我认为只要我的第一个
    bool
    数组不是
    const
    ,它就与
    std::find
    版本一致(我猜是因为
    inputierator
    类型将与非常量指针匹配,但与
    const
    指针不匹配?)。感谢您的回答(很遗憾,我无法投票:()顺便说一下,在C++中,没有一个叫做STL的东西,它代表了标准模板库。有一个旧的STL,但是没有人再使用它,因为在它被制作回来后,大部分都被采用到标准库中,而 < /C>可能起源于STL,使用它是不正确的。
    都是标准库的一部分。因此,您的困惑是:您正在使用标准库(
    ),这可能涉及
    。我过去认为STL(至少目前是这样)这只是标准库的一个部分非官方名称,主要用于提供基于模板的结构和算法。但是,是的,我有一种潜意识的想法,即库的STL部分在某种程度上是“次要的”到库的较旧部分,例如
    iostream
    。感谢您的澄清。
    #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;
    }