C++ 不允许使用不完整的类型(指针)

C++ 不允许使用不完整的类型(指针),c++,pointers,struct,C++,Pointers,Struct,我有一个大学问题,它要求如下(结构已经由老师给出): 编写一个函数空缺读日期(日期*d),按年/月/日的格式从键盘读取日期。为了简单起见,考虑用户总是输入有效日期。“ 问题本身很简单,我不明白的是为什么函数会给出错误(第7行-“不允许不完整类型”和“标识符d未定义”),我不明白这是老师的错误还是我的错误,因为“void readDate(Date*d)”是他给出的 #include <iostream> #include <string> using namespace

我有一个大学问题,它要求如下(结构已经由老师给出):

编写一个函数空缺读日期(日期*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;
}
#包括
#包括
使用名称空间std;
结构日期{
未签名整数年、月、日;
}日期;
无效读取日期(日期*d){
字符串日期;
尺寸指数;
getline(cin,date);//为了简单起见,用户输入被认为总是有效的
d->year=stoi(日期substr(0,3));
d->month=stoi(日期,substr(5,6));
d->day=stoi(date.substr(8,9));
}
int main()
{
结构日期*ptr=&Date;
重新分配日期(ptr);
返回0;
}
当前代码:

结构日期{//(1) 未签名整数年、月、日; }日期;/(2) 在(1)处创建名为
Date
的结构(类型),并在(2)处创建名为
Date
的该结构的实例。该结构的实例将使用相同名称对该类型进行阴影处理,这就是导致此问题的原因

从外观上看,实际上不需要全局定义
Date
实例。您应该能够将实例移动到
main
,这将其更改为:

结构日期{ 未签名整数年、月、日; }; ... int main() { 日期; Date*ptr=&Date;//您甚至可以避免此步骤,直接执行readDate(&Date) 读取日期(ptr); ... } 否则,代码:

void readDate(日期*d){
将标识符
Date
视为类型
Date
的一个实例,而不是类型
Date
本身——这会导致像您所经历的那样令人困惑的错误

如果需要全局定义
Date
实例,则理想情况下,您应该为其指定一个与类型不同的名称(例如
struct Date{…}Date;)
。如果不可能,则必须在该类型的所有使用前面加上
struct
,以消除歧义,如:

void readDate(结构日期*d){

如果教授给您的代码具有:

struct Date {
    ...
} Date;

void readDate(Date* d) {
    ...
}
那么他们一定给了你坏代码,因为——正如我上面所描述的——如果没有一些代码更改,这不是合法代码。

“struct Date{…}Date”
重写为

typedef struct _Date
{
...
} Date;

...

Date date;

为对象
Date
使用与类型
Date
不同的名称,或者在表示类型的任何位置写入
struct Date
,在表示对象的位置写入普通的
Date
(如果由于某种原因,无法将其更改为具有不同的名称)卢西斯:这个问题有两个答案。如果有人回答你的问题让你满意,请记住接受这个答案。否则,考虑留下一个评论的答案,以帮助提供反馈,为什么答案不被接受。(我通常不会对此发表评论,但我从你的帖子记录中注意到,问题似乎没有被接受的答案)结构日期的问题{…日期:是不是无效C++。Prof需要停止C++中的C语言教学。我完全同意。但是OP实际上没有明确说明< <代码>日期>代码>结构是否被赋予了<代码>日期<代码>实例,名为“代码>日期<代码>,或者是否是自己的添加。如果教授给出了函数的形式<代码>空缺读写器。ate(日期*d),我的假设是OP添加了<代码>日期>代码>实例。由于这个问题是C++的标记,如果OP能够修改<代码>结构日期< /代码>定义,最好将“<代码>日期>代码>实例从构造中删除,而不是将它改为<代码> TyPulfF。是C++样式的模式,它在C++中没有任何用途,因为所有类型标识符总是被添加到封闭的命名空间中(C,<代码> TyPulf结构……/COD>需要从标识符命名空间中引入标识符到标识符命名空间)。