i .
i .

Reputation: 485

c++ to_string error with date

I am trying to write a function that returns the date as a string. I went about this like so:

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;
}

this is giving four compile time errors. 1 of these:

to_string was not declared in this scope

and 3 of these:

Function to_string could not be resolved

one for each use of to_string.

According to everywhere else on the internet, this code should work. Can someone please shed some light on the subject?

Upvotes: 4

Views: 3513

Answers (2)

bames53
bames53

Reputation: 88195

std::to_string is part of C++11 and is in the <string> header. The following code works with g++ 4.7, as well as recent versions of clang and VC++. If compiling a file with these contents does not work for you, you are either invoking the compiler incorrectly for C++11 or using a compiler version with insufficient support for C++11.

#include <string>

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

However there is a better way to print dates in C++11. Here's a program that prints the current date (in ISO 8601 format).

#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'; }

Unfortunately gcc 4.8 appears to lack put_time (and of course VC++ currently lacks constexpr and universal initializers, but that is easily worked around. VC++ has put_time).

Upvotes: 1

i Code 4 Food
i Code 4 Food

Reputation: 2154

As has been mentioned in the comments, what you're trying to use requires C++11. This means both a compiler that supports C++11 (E.g. GCC 4.7+), AND possibly manually enabling C++11 (E.g. flag -std=c++11), so check both of those if you believe it should be working for you.

If you're stuck with a compiler that does not support C++11, you can use the following to achieve what you want, with regular 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
}

Note that for the Day and Month parameters, I used %02d to force it to display at least 2 digits, so 5/1 will actually be represented as 05/01. If you don't want that, you can just use %d instead, which will behave like your original to_string. (I'm not sure what format you're using for currentYear, but you'll probably also want to use either %02d or %04d for that parameter)

Upvotes: 3

Related Questions