从静态函数

时间:2016-10-03 21:34:07

标签: c++

我有两个文件:DateTime.h和DateTime.cpp,如下所示:

DateTime.h

class DateTime
{
public:
    static string getCurrentTimeStamp();
};

DateTime.cpp

#include "stdafx.h"
#include "DateTime.h"
#include <ctime>
#include <chrono>
#include <iostream>
#include <string>
using namespace std;

string DateTime::getCurrentTimeStamp()
{
    return "";
}

我的编译器(Visual Studio 2012)在函数getCurrentTimeStamp()返回std::string对象时正在吐出错误。错误都指向语法问题,但没有一个是明确的。有谁理解为什么会出现这种情况?

更新:以下是(部分)错误。

  

错误6错误C2064:term不评估为0的函数   参数c:\ users \ anthony \ documents \ code \ consoleapplication1 \ datetime.cpp 21 1 ConsoleApplication1

     

错误1错误C2146:语法错误:缺少';'在标识符之前   'getCurrentTimeStamp'c:\ users \ anthony \ documents \ code \ consoleapplication1 \ datetime.h 5 1 ConsoleApplication1

     

错误7错误C2146:语法错误:缺少';'在标识符之前   'getCurrentTimeStamp'c:\ users \ anthony \ documents \ code \ consoleapplication1 \ datetime.h 5 1 ConsoleApplication1

     

错误5错误C2371:'DateTime :: getCurrentTimeStamp':重新定义;   不同的基础   类型c:\ users \ anthony \ documents \ code \ consoleapplication1 \ datetime.cpp 10 1 ConsoleApplication1

1 个答案:

答案 0 :(得分:2)

当尝试诊断头文件的问题时,尤其是像这样的简单文件,第1步是尝试查看编译器看到的内容。

#include是一个预处理器指令,因此编译器没有看到它,相反,编译器会看到您处理的文件的预处理输出。重新尝试包括。

所以你的代码看起来像这样:

    #include "stdafx.h"

    //#include "DateTime.h"
    class DateTime
    {
    public:
        static string getCurrentTimeStamp();
    };
    //#include "DateTime.h"

    #include <ctime>
    #include <chrono>
    #include <iostream>
    #include <string>
    using namespace std;

    string DateTime::getCurrentTimeStamp()
    {
        return "";
    }

http://rextester.com/MODV66772

当我尝试在RexTester的在线Visual Studio上编译时,我得到了非常不同的错误,告诉我你的stdafx.h不是空的。

如果我稍微修改一下代码:

    //#include "stdafx.h"

    //#include "DateTime.h"
    #include <string>

    class DateTime
    {
    public:
        static std::string getCurrentTimeStamp();
    };
    //#include "DateTime.h"

    #include <ctime>
    #include <chrono>
    #include <iostream>
    #include <string>
    using namespace std;

    string DateTime::getCurrentTimeStamp()
    {
        return "";
    }

现在编译时没有您报告的错误/警告:http://rextester.com/PXE62490

变化:

  • 包含在头文件中,因为标题取决于它,
  • 使用std::string代替string

C ++编译器是单通道编译器,因此头文件不能知道您打算稍后执行using namespace std,即使它确实如此,它也是一种可怕的做法,因为std命名空间密集。

如果您无法在所有地方输入std::,请尝试using您需要的名称,例如

using std::string;  // string no-longer needs to be std::string