C++ STL错误u代码中没有任何STL
我在cygwin上使用gcc 3.4.4。我在下面的代码中得到了这个相当复杂的STL错误消息,它根本不使用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
#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可以是两个参数的函数而不是三个参数的函数
下面简要总结了消除错误的三种方法:
代码>行
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;
}