这是一个最小的例子:
#include <algorithm>
#include <vector>
using namespace std;
vector<int> count;
int main() {
int(count.size());
return 0;
}
使用
进行编译$ \g++ --std=c++0x -ggdb -D_GLIBCXX_DEBUG -W -pipe \
-mmmx -msse -msse2 -msse3 \
-ftrapv -Wall -Wextra \
-Wctor-dtor-privacy -Wlogical-op -Wnoexcept \
-Woverloaded-virtual -Wsign-promo -Wstrict-null-sentinel \
-Wstrict-overflow=5 -Wundef -Weffc++ \
-Wcast-align \
-Wcast-qual -Wchar-subscripts -Wcomment \
-Wconversion \
-Wdisabled-optimization -Wfloat-equal \
-Wformat \
-Wformat=2 -Wformat-nonliteral -Wformat-security \
-Wformat-y2k -Wimport -Winit-self -Winline \
-Winvalid-pch -Wunsafe-loop-optimizations \
-Wmissing-braces -Wmissing-field-initializers \
-Wmissing-format-attribute -Wmissing-include-dirs \
-Wmissing-noreturn -Wpacked -Wpadded \
-Wpointer-arith \
-Wredundant-decls -Wreturn-type -Wsequence-point \
-Wshadow \
-Wsign-compare -Wstack-protector \
-Wstrict-aliasing \
-Wstrict-aliasing=2 -Wswitch -Wswitch-default \
-Wswitch-enum -Wtrigraphs -Wuninitialized \
-Wunknown-pragmas -Wunreachable-code \
-Wvolatile-register-var -Wwrite-strings -Wunused-parameter \
-Wno-parentheses d.cpp
即。我从其他问题得到的大多数警告标志,我得到:
d.cpp: In function 'int main()':
d.cpp:7:5: error: expected primary-expression before 'int'
int(count.size());
^
d.cpp:7:5: error: expected ';' before 'int'
Status 1
显然,由于在count
中声明了<algorithm>
,因此感到困惑。但错误消息并未显示出来。
如果有一个警告说向量与函数同名,那就没关系了。 有这样的警告吗?
删除using namespace std;
可以避免此问题,但是在using namespace std;
出现时是否仍然有效警告?它所要做的就是跟踪当前上下文中的符号,编译器已经执行了这些符号,并在语句隐藏或重新声明时发出警告。看起来像一个简单的功能,我无法相信它已经不会这样做。
答案 0 :(得分:2)
显然,它被混淆了,因为计数是在。但错误消息并未显示出来。
使用gcc之外的其他内容,您会看到更好的错误消息。来自gcc的错误消息有所改善,但这并没有多说。来自gcc的错误消息因缺乏清晰度而臭名昭着。在这方面,来自clang的信息更加清晰。它讲述了两个无法区分的候选者,一个是count.size()
,其中“count”是您声明的向量,另一个是std::count.size()
,其中std::count
在标题中定义<algorithm>
。
这个特定问题的解决方案很简单:摆脱using namespace std
语句,摆脱无关的#include
指令。键入std::vector<int>
而不是vector<int>
,几乎没有任何成本。当代码需要被其他人理解和维护时,输入额外的五个字符可以节省大量下游时间。当你不再理解你的代码所做的事情时,那个“别人”可能就是你从现在开始的六个月。