MS VC中的错误C2143(缺少;在命名空间之前)包括

时间:2010-11-30 00:38:49

标签: c++ visual-studio

我非常困惑,为什么我突然得到这个奇怪的错误:

Time.h是一个非常简单的类,它在类描述的末尾有一个分号,所以我很确定我的代码在这里是正确的..然后我得到相同的错误:Microsoft Visual Studio 10.0 \ VC \ include \ memory ..任何想法!?!?谢谢!

编译器输出

1>ClCompile:
1>  Stop.cpp
1>c:\projectnextbus\Time.h(17): error C2143: syntax error : missing ';' before 'using'
1>c:\projectnextbus\Time.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  NextBusDriver.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory(16): error C2143: syntax error : missing ';' before 'namespace'
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\memory(16): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

更新: 无法真正发布所有代码,因为这是针对学校项目的,我们不应该在提交之前发布,但小片段应该没问题。

time.h中

#ifndef TIME_HPP
#define TIME_HPP

#include <string>
#include <sstream>

using namespace std;

class Time {
// Defines a time in a 24 hour clock

public:
    // Time constructor
    Time(int hours = 0 , int minutes= 0);

    // POST: Set hours int
    void setHours(int h);

    // POST: Set minutes int
    void setMinutes(int m);

    // POST: Returns hours int
    int getHours();

    // POST: Returns minutes int
    int getMinutes();

    // POST: Returns human readable string describing the time
    // This method can be overridden in inheriting classes, so should be virtual so pointers will work as desired
    string toString();

private: 
    string intToString(int num);
    // POST: Converts int to string type

    int hours_;
    int minutes_;

};

#endif

DepartureTime.h(继承类)

#ifndef DEPARTURE_TIME_HPP
#define DEPARTURE_TIME_HPP

#include <string>
#include "Time.h"

using namespace std;

class DepartureTime: public Time {
public:
    // Departure Time constructor
    DepartureTime(string headsign, int hours=0, int minutes=0) : Time(hours, minutes), headsign_(headsign) { }

    // POST: Returns bus headsign
    string getHeadsign();

    // POST: Sets the bus headsign
    void setHeadsign(string headsign);

    // POST: Returns human readable string describing the departure
    string toString();

private:
    // Class variables
    string headsign_;
};
#endif

6 个答案:

答案 0 :(得分:15)

如果一个包含文件在文件的 end 处出现错误(或缺少分号),并且该文件紧接在另一个文件之前,则会发生这种情况。生成的错误表示第二个包含文件而不是第一个包含文件存在问题。所以作为一个起点,请确保,如果你有一个在Time.h之前包含的文件,那就没有任何错误。

粘贴.h和.cpp文件的内容肯定会有用,而不仅仅是错误信息。

答案 1 :(得分:3)

这几乎总是由于失踪造成的;在报告错误的标题之前的标题中。

在Time.h之前,Stop.cpp包含了什么?查看该文件的结尾,您可能会看到问题所在。

答案 2 :(得分:1)

我遇到了同样的问题,但我发现在我的代码中出现这个错误的原因是我忘了在我的一个类的类声明之后加一个分号。尝试查看您的文件以确保您有一个,并且为了好的措施,只需在所有文件的末尾添加一个分号。为我工作!

答案 3 :(得分:1)

已经很久以前了,但我也有同样的错误(至少数量),Qt和MSVC并且可以解决它,所以这是我的贡献。

我设法通过使用编译器标志/ P找到了罪魁祸首。这会生成带有标头的文件。通过搜索代码,指向的错误我可以发现预处理器实际上替换了模板参数(我有一个名字很糟糕的#define)

答案 4 :(得分:0)

回到我多年没碰过的项目并且第一次使用MSVC2015之后,我遇到了同样的错误。我认为我的环境已经过时或者库未经过编译器测试。

最终我注意到,在从项目中休息了几个月后,我写的最后一次提交打破了构建,添加了

namespace Foo {

到每个标题,无需添加结束括号。

如果您要回到旧项目,请务必检查git log。 :)

答案 5 :(得分:0)

进行大合并时遇到了这个问题。

我犯了一个错误,无意中错过了一个头文件顶部的前向声明:

class CTrainTrack;

添加此行可修复所有问题!

如果执行合并,请尝试:

  1. 弄清楚是否有引起问题的特定班级
  2. 请参考旧代码,以查看文件中是否存在引用该类的行,而该行不再包含在新代码中。