C++ &引用;在'之前应为不合格id;名称空间'&引用;错误

C++ &引用;在'之前应为不合格id;名称空间'&引用;错误,c++,debugging,namespaces,C++,Debugging,Namespaces,我有以下看似无害的代码: #ifndef UI_H #define UI_H #include <string> namespace ui { //Displays the main menu, showing loaded vocabulary cards // //Returns upon completion of display void displayMainMenu(); //...More code like the abo

我有以下看似无害的代码:

#ifndef UI_H
#define UI_H

#include <string>

namespace ui
{
    //Displays the main menu, showing loaded vocabulary cards
    //
    //Returns upon completion of display
    void displayMainMenu();

    //...More code like the above, just comments followed by functions
}

#endif

我在这里做错了什么?

此文件来自何处。文件没有问题 你张贴;我怀疑正在发生的是包括 它已经包含了
(所以这个包含什么都不做),并且
缺少一个
在它包含您的文件之前。

嗯,这很奇怪。是否还有其他定义的UI(不应该引起问题,但谁知道呢)或UI

同样的事情会发生在#pragma上一次吗(假设您的编译器支持它)

你有没有逐字逐句地将文件配对,以便注释掉所有其他代码


(为发布更多问题而不是答案而道歉)

追踪此类错误的一种方法是从头开始:

#include "filepath/ui.h"
int main () { return 0; }
这个编译吗?(这对于您提供的ui.h的小片段很好。)

类似这样的错误通常是由于以前的某些类声明中缺少分号造成的。因此,让我们尝试强制解决这个问题:

struct Foo { int foo; } // Note the missing semicolon after the close brace.

#include "filepath/ui.h"
int main () { return 0; }
这当然不是编译干净的。我从我的testmain.cpp到您的filepath/ui.h到string得到一个复杂的include路径跟踪。。。最终得到

/usr/include/i386/_types.h:37: error: two or more data types in declaration of '__int8_t'
这不是错误,但缺少的分号肯定会造成混乱。您的错误并不是在
的内心深处产生的,因此在尝试重新创建错误之前,让我们先将测试程序
#包括在内:

#include <string>
struct Foo { int foo; } // Note the missing semicolon after the close brace.

#include "filepath/ui.h"
int main () { return 0; }
就在那里。因此,在filepath/ui.h之前包含的其他一些头的类声明格式不正确

附录
有时使用不同的编译器会有所帮助。g++因其对这种常见编程错误的糟糕处理而臭名昭著。用铿锵的语调编译上述内容

testmain.cpp:4:2: error: expected ';' after struct
塔达,克朗把注意力集中在这个问题上了

发生的事情是,当编译器遇到麻烦时,它会对代码进行一些修复,以使其语法正确。编译器错误消息基于此自动更正。注意:这种自动校正通常是一件非常好的事情。如果没有它,编译器必须在第一次出错时关闭。由于程序员不可避免地会犯不止一个错误,一次找出一个错误将是一件痛苦的事


我完全不知道goofy correction g++应用于修复缺少分号的问题,除了不添加明显缺少的分号。clang添加了缺少的分号,这就是它抱怨的地方。

我是通过谷歌搜索得到的。如果任何人由于相同的错误登录到此页面,如果您尝试在类范围中定义命名空间别名,也可能会出现此错误

例如:

namespace SomeLongNamespaceName { }
class SomeClass {
    namespace X = SomeLongNamespaceName; // This is illegal and will give the
                                         // compiler error from this question
};
有关更多信息,请访问: 在我的例子中,“name”是一个错误。应为:“命名空间”之前的非限定id
文件顶部的一个标头中的类声明中的命名空间。因此,我需要在最后的
'}'
之后添加额外的分号。例如
'};;;'就可以了。

通常,当你忘记了一个
某个地方,或者您使用某个未定义的东西。你确信你的头文件看起来完全一样吗?另一种可能性:你是用C编译器编译而不是C++编译器(但是C编译器应该抱怨不能找到<代码> <代码>)。不管怎样,你的代码对我来说是有效的。所以我怀疑RedX解决了这个问题:您没有向我们展示导致这个bug的代码。@RedX-是的,这就是我的整个头文件。我来看看杰姆斯的答案,看看这是不是问题。“戴维,我敢肯定我用的是C++编译器。我看到Qt调用g++。如果您试图在类中声明名称空间,也可能会导致这种情况。找到困难的方法…它包含在3个不同的文件中。编译器只是在filepath/vocabword.cpp:1:
包含的文件中抱怨
,但是对于使用
ui.h
的每个文件,包含是文件的第一行,因此不可能是它。还有其他想法吗?提供一个完整的例子来说明错误。开始剥离你的代码,直到你有足够小的东西发布。在这个过程中,您很有可能自己发现错误;)可能是针对特定的.cpp?@ErrorUserName的一些不同的编译器设置,如果编译器只是抱怨包含
ui.h
的文件之一,那么问题显然出在该文件中。(可能是编辑器没有显示的某个外来字符?)否则:在系统
string
之前的include路径中是否有一个名为
string
的文件?谢谢你的回答!不幸的是,使用pragma曾经产生过同样的结果,我将UI_H重命名为USERINTERFACE_H,以防Qt已经定义了UI_H。没有帮助。我已经注释掉了Qt抱怨的文件,Qt刚刚开始抱怨另一个文件。我会进一步追查的。哇,这正是问题所在。非常感谢你,大卫!
testmain.cpp:4:2: error: expected ';' after struct
namespace SomeLongNamespaceName { }
class SomeClass {
    namespace X = SomeLongNamespaceName; // This is illegal and will give the
                                         // compiler error from this question
};