菜鸟小乔 发表于 2019-6-3 13:21:55

C++写静态链表时报错“间接寻址级别不同”。

本帖最后由 菜鸟小乔 于 2019-6-3 13:24 编辑

问题描述:静态链表初始化代码只写了初始化函数,就报错:

错误        C2040       “Slist”:“Slist ”与“Slist”的间接寻址级别不同.

请问这个错误具体原因是什么?如何改正?


-----------StaticLinkList.h文件---------------------
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
        int id;
        string name;
}EleType;

//静态链表,就是一个结构数组
typedef struct Slist{
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist;

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif

-------------------.cpp文件---------------------
#include<iostream>
#include"StaticLinkList.h"
using namespace std;


void InitSLL(Slist sList)//初始化静态链表:每个元素的游标都指向下一个元素
{
        for (int i = 0; i < MAX_SIZE_SSL; i++)//数组第一个元素的游标存放第一个空闲节点的下标
        {
                sList.next = i + 1;
        }
       
        sList.next = 0;//将最后一个结点置空(最后一个元素的next用来保存第一个插入的元素的下标)
       
        sList.next = 0;//倒数第二个元素也置零(备用链表尾结点置空,去除首尾后剩余的部分是备用链表)
}

------------------main.cpp----------------------------------
#include<iostream>
#include"StaticLinkList.h"
using namespace std;

void testSLL();

int main()
{
        testSLL();
      return 0;
}

void testSLL()
{
        Slist sList;
        InitSLL(sList);
}

人造人 发表于 2019-6-3 13:35:20

把.cpp改成.c看看
main.c和StaticLinkList.c

菜鸟小乔 发表于 2019-6-3 15:14:15

本帖最后由 菜鸟小乔 于 2019-6-3 15:17 编辑

人造人 发表于 2019-6-3 13:35
把.cpp改成.c看看
main.c和StaticLinkList.c

试了,改文件类型以及头文件,不行。。。

我新建了一个工程,写了一样的代码,就没有报错。。。

我又试了原来那个有问题的工程文件,只留了main.cpp文件,只写了一个return 0;的空的main函数,竟然也报错,这是工程文件哪里有问题吗??

人造人 发表于 2019-6-3 23:01:30

本帖最后由 人造人 于 2019-6-3 23:12 编辑

在C++中
struct EleType
{
      int id;
      char name;
};

EleType e1;
struct EleType e2;


EleType e1;
struct EleType e2;
加struct和不加完全一样,书上好像就是这么写的
struct后面的名字在全局空间

在C语言中
struct EleType
{
      int id;
      char name;
};

EleType e1;
struct EleType e2;

EleType e1;报错,说找不到这个名字

C语言中的struct后面这个名字不在全局空间,你用的时候每次都要加上struct,很麻烦,解决方法是用typedef把这个名字放到全局空间
例如这样就可以了
typedef struct EleType
{
      int id;
      char name;
} Eletype;

EleType e1;
struct EleType e2;


但是在C++中名字本来就在全局空间,你用typedef反而导致了名字冲突

也就是说,理论上改成这样就行了
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
      int id;
      string name;
}EleType;

//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct {
      EleType data;
      int next;                //游标cursor,若果为零表示无指向
}Slist;

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif



但是,C/C++中的这个typedef真的就是一个别名,你这样改编译器会说
‘void InitSLL(<unnamed struct>*)’, declared using unnamed type, is used but never defined

编译器会说Slist sList的类型是<unnamed struct>*


C/C++中的这个typedef真的就是一个别名
那么好吧,这样总行了吧,你别说这样一改还真行了^_^
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
      int id;
      string name;
}EleType;

//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct Slist_tag{
      EleType data;
      int next;                //游标cursor,若果为零表示无指向
}Slist;

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif


也就是保证struct后面的名字和typedef生成的名字不一样,因为这两个名字都在全局空间,名字一样会导致冲突
//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct Slist_tag{
      EleType data;
      int next;                //游标cursor,若果为零表示无指向
}Slist;

人造人 发表于 2019-6-3 23:07:11

本帖最后由 人造人 于 2019-6-3 23:17 编辑

这个位置没用了,可以删除,我好像无法删除

人造人 发表于 2019-6-3 23:09:10

本帖最后由 人造人 于 2019-6-3 23:17 编辑

这个位置也没用了,可以删除,我好像无法删除

人造人 发表于 2019-6-3 23:10:00

本帖最后由 人造人 于 2019-6-3 23:18 编辑

这个位置也没用了,可以删除,我好像无法删除

菜鸟小乔 发表于 2019-6-4 11:58:09

人造人 发表于 2019-6-3 23:10
这个位置也没用了,可以删除,我好像无法删除

我也无法删除,送你上最佳答案吧,谢谢帮忙看帖啦~{:10_333:}
页: [1]
查看完整版本: C++写静态链表时报错“间接寻址级别不同”。