带有日期的c ++ to_string错误

时间:2013-05-26 21:47:49

标签: c++ tostring

我正在尝试编写一个以字符串形式返回日期的函数。我这样做是这样的:

string date() // includes not listed for sake of space, using namespace std
{
    tm timeStruct;
    int currentMonth = timeStruct.tm_mon + 1;
    int currentDay   = timeStruct.tm_mday;
    int currentYear  = timeStruct.tm_year - 100;
    string currentDate = to_string(currentMonth) + "/" + to_string(currentDay) + "/" + to_string(currentYear);
    return currentDate;
}

这给出了四个编译时错误。 其中一个:

to_string was not declared in this scope

和其中3个:

Function to_string could not be resolved

每次使用to_string一次。

根据互联网上的其他地方,这段代码应该有效。有人可以就这个问题说清楚吗?

2 个答案:

答案 0 :(得分:3)

正如评论中所提到的,您尝试使用的内容需要C ++ 11。这意味着支持C ++ 11的编译器(例如GCC 4.7+)和可能手动启用C ++ 11(例如标志-std=c++11),所以如果您认为它应该适合您,请检查这两者

如果您遇到不支持C ++ 11的编译器,您可以使用以下内容通过常规C ++实现您的目标:

string date()
{
    tm timeStruct;
    int currentMonth = timeStruct.tm_mon + 1;
    int currentDay   = timeStruct.tm_mday;
    int currentYear  = timeStruct.tm_year - 100;
    char currentDate[30];
    sprintf(currentDate, "%02d/%02d/%d", currentMonth, currentDay, currentYear);
    return currentDate; // it will automatically be converted to string
}

请注意,对于日期和月份参数,我使用%02d强制它显示至少2位数,因此5/1实际上将表示为05/01。如果您不想这样,则可以改为使用%d,其行为与原始to_string相同。 (我不确定您为currentYear使用的格式,但您可能还希望对该参数使用%02d%04d

答案 1 :(得分:1)

std::to_string是C ++ 11的一部分,位于<string>标题中。以下代码适用于g ++ 4.7,以及clang和VC ++的最新版本。如果使用这些内容编译文件不适合您,则要么是为C ++ 11错误地调用了编译器,要么是使用对C ++ 11支持不足的编译器版本。

#include <string>

int main() {
  int i;
  auto s = std::to_string(i);
}

但是有一种更好的方法可以在C ++ 11中打印日期。这是一个打印当前日期的程序(采用ISO 8601格式)。

#include <ctime>     // time, time_t, tm, localtime
#include <iomanip>   // put_time
#include <iostream>  // cout
#include <sstream>   // stringstream
#include <stdexcept> // runtime_error
#include <string>    // string

std::string date() {
  static constexpr char const *date_format = "%Y-%m-%d"; // ISO 8601 format

  auto t = std::time(nullptr);
  if (static_cast<std::time_t>(-1) == t) {
    throw std::runtime_error{"std::time failed"};
  }

  auto *cal = std::localtime(&t);
  if (nullptr == cal) {
    throw std::runtime_error{"std::localetime failed"};
  }

  std::stringstream ss;
  ss << std::put_time(cal, date_format);
  return ss.str();
}

int main() { std::cout << date() << '\n'; }

不幸的是,gcc 4.8似乎缺少put_time(当然VC ++目前缺少constexpr和通用初始化程序,但这很容易解决.VC ++有put_time)。