【发布时间】:2011-05-04 09:07:29
【问题描述】:
当我编译这个程序时:
#include<iostream>
using namespace std;
std::cout<<"before main"<<endl;
int main()
{
}
...我从编译器中看到了这个错误:
错误:预期的构造函数, 析构函数,或之前的类型转换 '
请帮助我理解这意味着什么以及我的程序有什么问题?
【问题讨论】:
-
问题是为什么大多数 c++ 编译器都会给出如此糟糕的错误信息。
-
希望智能编译器能产生更好的错误。
-
好吧,在这种情况下要给出有意义的信息并不容易。甚至 clang 说:“错误:命名空间 'std' 中没有名为 'cout' 的类型”和
operator<<的“错误:预期的 unqualified-id”。 -
@Ugo:人类很容易阅读和看到错误,因为我们看到的上下文比编译器在错误点看到的要多。编译器只看到了错误点之前的内容(可能是错误之后的一两个标记,因为它试图确定错误)。因此,鉴于这一点以及对 C++ 语法的理解,错误变得更加明显。编译器看到 std::cout 并且现在正在寻找“构造函数、析构函数或类型转换”,因为这些是唯一可以生成有效声明或语句(因此也是有效程序)的下一个标记。
-
@Martin 我同意你的观点,并且我知道在编写编译器时可能会遇到的问题(真的)。但有时它只是让我难过。例如,我们必须等待 gcc4.6 才能“更清晰地诊断 |class|、|struct| 和 |union| 定义之后的丢失分号”... 结构在大约 40 年前出现在 C 中:'(.
标签: c++