Мне была дана задача реализовать форматированный вывод значений Struct tm
с использованием шаблонов C ++, но компилятор выдает ошибку: недопустимое использование неполного типа . Я не могу понять, как компилятор обрабатывает шаблон во время компиляции?
Я изучил основы программирования шаблонов и последовал нескольким небольшим примерам, но мне не удалось полностью понять концепцию, так как я новичок в шаблонах на C ++. Задача ограничивает функцию форматирования typedefed , например, так:
typedef /* place code here*/ date_dotted_format;
У меня есть структура now
типа tm
, которая содержит текущее местное время следующим образом:
time_t tmp;
struct tm now;
time(&tmp);
(void)localtime_r(&tmp, &now);
и я пытаюсь напечатать значения следующим образом:
std::cout << date_dotted_format(now) << std::endl; // Expected output: YYYY.MM.DD, e.g. 2019.04.26
date_dotted_format
был typedefed
следующим образом:
typedef struct date_dotted_format date_dotted_format;
и реализация date_dotted_format
находится в заголовочном файле, который выглядит следующим образом:
#include <ctime>
template<typename T>
String date_dotted_format(T now)
{
struct tm my_tm;
my_tm.tm_year = now.tm_year + 1900;
my_tm.tm_mon = now.tm_mon + 1;
my_tm.tm_mday= now.tm_mday;
return (my_tm.tm_year + "." + std::setw(2) + std::setfill('0') + my_tm.tm_mon + "." + my_tm.mday);
}
При компиляции я получаю следующие ошибки:
in file formatted_output.hpp
error: ‘String’ does not name a type
String date_formata(T now)
^
in file formatted_output.cpp
error: invalid use of incomplete type ‘date_dotted_format {aka struct main(int, char**)::date_dotted_format}’
std::cout << date_dotted_format(now) << std::endl; // Expected output:
YYYY.MM.DD, e.g. 2019.04.15
и следующие примечание :
note: forward declaration of ‘date_dotted_format {aka struct main(int, char**)::date_dotted_format}’
typedef struct date_dotted_format date_dotted_format;
Могу ли я найти подсказку, где искать?