Неполный тип не допускается (указатель) - PullRequest
0 голосов
/ 26 апреля 2020

У меня проблема с колледжем, которая спрашивает следующее (структура уже задана учителем):

"Напишите функцию void readDate (Date * d), которая считывает дату с клавиатуры, в формат год / месяц / день. Для простоты учтите, что пользователь всегда вводит правильную дату. "

Сам вопрос прост, но я не понимаю, почему функция выдает ошибку (строка 7 - «неполный тип недопустим» и «идентификатор d не определен», и я не понимаю, была ли это ошибка учителя или моя, поскольку «void readDate (Date * d)» был им дан.

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

struct  Date{
    unsigned int year, month, day;
} Date;

void readDate( Date* d) {
    string date;
    size_t index;
    getline(cin, date); //for simplicity, user input is considered to be always valid
    d->year = stoi(date.substr(0, 3));
    d->month = stoi(date.substr(5, 6));
    d->day = stoi(date.substr(8, 9));
}

int main()
{
    struct Date* ptr = &Date;
    realDate(ptr);
    return 0;
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Текущий код:

struct  Date{ // (1)
    unsigned int year, month, day;
} Date; // (2)

Создает структуру (тип) с именем Date в (1), а экземпляр этой структуры также называется Date в (2). Экземпляр структуры будет shadow тип с тем же именем, что является причиной этой проблемы.

Судя по всему, вам не нужно, чтобы экземпляр Date определялся глобально. Вы должны иметь возможность переместить экземпляр в main, который изменит это так:

struct Date{
    unsigned int year, month, day;
};

...

int main()
{
    Date date;
    Date* ptr = &date; // you can even avoid this step, and just do readDate(&date) directly
    readDate(ptr);
    ...
}

В противном случае код:

void readDate(Date* d) {

будет обрабатывать идентификатор Date как экземпляр типа Date, но не как сам тип Date - что приводит к сбивающим с толку ошибкам, с которыми вы сталкиваетесь.

Если экземпляр Date необходимо определить глобально, то в идеале вы должны дать ему имя, отличное от типа (например, struct Date { ... } date;). Если это невозможно, вам придется префиксировать все варианты использования типа с struct, чтобы устранить неоднозначность, как:

void readDate(struct Date* d) {

Если проф дал вам код, который имеет:

struct Date {
    ...
} Date;

void readDate(Date* d) {
    ...
}

Тогда они, должно быть, дали вам неработающий код, поскольку - как я описал выше - - это не юридический код без некоторых изменений кода.

0 голосов
/ 27 апреля 2020

Переписать "struct Date {...} Date" на что-то вроде

typedef struct _Date
{
...
} Date;

...

Date date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...