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);
} 把.cpp改成.c看看
main.c和StaticLinkList.c 本帖最后由 菜鸟小乔 于 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: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:17 编辑
这个位置没用了,可以删除,我好像无法删除 本帖最后由 人造人 于 2019-6-3 23:17 编辑
这个位置也没用了,可以删除,我好像无法删除 本帖最后由 人造人 于 2019-6-3 23:18 编辑
这个位置也没用了,可以删除,我好像无法删除 人造人 发表于 2019-6-3 23:10
这个位置也没用了,可以删除,我好像无法删除
我也无法删除,送你上最佳答案吧,谢谢帮忙看帖啦~{:10_333:}
页:
[1]