c语言errorc2664

c语言errorc2664,第1张

需要修正一个语法错误,一个逻辑错误。

#include <stdio.h>

#include <雹裂string.h>

int main()

{

    携肆哪char max[20], str[3][20]

    int i

    printf("输入三个字符串:\n")

    for (i=0 i<辩码3 i++)

        gets(str[i]) // str 的类型是char[2][20],需要改成str[i]

    if (strcmp(str[0], str[1]) > 0)

       strcpy(max, str[0])

    else

        strcpy(max, str[1])

    if (strcmp(str[2], max) > 0) // 只有str[2]大于max才进行复制

        strcpy(max, str[2])

    printf("三个字符串中的最大串为%s\n", max)

    return 0

}

你好,我也正好在学这个问题,下面我的分析和解决方案。

你的代码里存在两个问题,第一个问题的本质是vector类的初始化问题,第二个问题的本质是两个类的声明定义顺序问题。第二个问题你并没有提出,但在一些编译器中会报错。

我先解决你的提出的问题,也就是第一个问题

 std::vector<Screen>screens{ Screen(24, 80, ' ') }

这句话最核心的部分编译器是则渗这么理解的:

vector<Screen>screens(Screen(24, 80, ' '))

即初始化一个vector对象screens,给的初始值是一个Screen类。那么,编译器首先会把给的Screen类转化为vector类,再赋值给screens。问题在于,我们定义的Screen类中并没有说明Screen类和vector类的转化关系,因此会报错。

但我们希望的是将给的Screen类作为screens的一个元素,故这里编译器没能理解我们的意图,如果你手头有《C++ primier 中文版第五版》的话,建议你看一下第87页关于vector类的初始化的内容,这页表格里的第二行是编译器的理解方式。如果我们要让编译器按我们的想法看问题,只用将代码修改为:

std::vector<Screen> screens{ 1,Screen(24, 80, ' ') }

这样初始化过程编译器会理解为,将给定的Screen类作为vector对象screens的第一个元素来初始化screens,就不会报错了。

这样的修改是基于你使用的编译器不要求类声明顺序的情况,如果你看了我说的,在尝试的过程中出现了未定义类声明之类的错误,说明你这次使用的编译器要求声明顺序(我用VS2013默认的编译器就出现了问题)。那么你首先要解决我说的第二个问题。这时对程序的修改会有些不一样。

我在看到你的问题时,首先用你的代码试着编译(VS2013默认编译器)了一下,报错如下:

你的Window_mgr 类定义在类Screen 之后,但在Screen中又要声明Window_mgr中的clear成员函数作为友元。对于一些对声明顺序有强制要求的编译器,这是无法接受的。

因此,Window_mgr的定义应该在Screen之前,头文件中的开头部分代码修改为:

#include<iostream>

#include<string>

#include<vector>

class Screen//先声明Screen类

class Window_mgr //再定义Window_mgr类

{

public:

         using ScreenIndex =std::vector<Screen>::size_type

         voidclear(ScreenIndex)

private:

         std::vector<Screen>screens{ Screen(24, 80, ' ') }

 

}

class Screen//最后定义Screen类 {//这之后的代码不变

这样的修改参照了C++Primier中文版第五版 252页的意见。

再次编译,错误如下:

显然,改变定义顺序,虽然解决了前面提到的第一个错误孙薯脊,但是在Window_mgr定义时,Screen的构造函数还未定义,因此,对Window_mgr中screens数据成员的初始化最好使用构造函数。在Window_mgr中声明构造函数Window_mgr(),在头文件后面定义这一函数,这样的话头文件的代码是这样。

开头:

中间Screen部分不变,

结尾:

到这里,声明顺序的问题已经解决,然后关于vector类型初始化的问题只用把结尾这句修改为

真·结尾:

就可以了,这样修改的理由我在手扒最开始已经说明。

总的来说,你提出的问题的核心是关于vector类的初始化,这个问题你看我最开始几段就解决了,然后如果编译器严格要求声明顺序,那么你需要看完全部内容,才可以通过编译。

希望我的回答可以解决你的问题。

struct node *list(int c[P][Q],struct node*p1,struct stu[P][Q])

你没有定义过名字段衡叫 stu 的握孝做结构慎胡体啊


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8269171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存