c++ error C2228的解决办法

2024年11月17日 23:56
有2个网友回答
网友(1):

就这个程序而言,你的错误有两个,一是link有的是大写有的小写,前后不一,编译器不识别,二是List List();这句话应该这样:List List;这才真正创建了一个对象List,如下修改:
#include
using namespace std;
template
struct LinkNode{
T data;
LinkNode *Link;
LinkNode(LinkNode *ptr=NULL){Link=ptr;}
LinkNode(const T& item,LinkNode *ptr=NULL)
{
data=item; Link=ptr;
}
};
template
class List{
public:
List(){first=new LinkNode;}
List(const T&x){first=new LinkNode(x);}
//List(List& L);
~List(){makeEmpty();}
void makeEmpty();
LinkNode* Locate(int i);
bool Insert(int i,T&x);
bool Remove(int i,T&x);
void input();
void output();
protected:
LinkNode*first;
};
template
void List::makeEmpty()
{
LinkNode *q;
while (first->Link!=NULL)
{
q=first->Link;
first->Link=q->Link;
delete q;
}
}
template
LinkNode *List::Locate(int i)
{
if(i<0) return NULL;
LinkNode *current=first; int k=0;
while (current!=NULL&&k {
current=current->Link; k++;
}
return current;
}
template
bool List::Insert(int i,T&x)
{
LinkNode* current=Locate(i);
if (current=NULL) return false;
LinkNode* newNode=new LinkNode(x);
if (newNode==NULL){cerr<<"存储分配错误!"< newNode->Link=current->Link;
current->Link=newNode;
return true;
}
template
bool List::Remove(int i,T&x)
{
LinkNode*current=Locate(i-1);
if (current==NULL ||current->Link==NULL) return false;
LinkNode*del=current->Link;
current->Link=del->Link;
x=del->data;
delete del;
return true;
}
template
void List::output()
{
LinkNode*current=first->Link;
while (current!=NULL)
{
cout<data< current=current->Link;
}
}
template
void List::input()
{
LinkNode*current=first->Link;
while(current->data!=0)
{
cin>>current->data;
current=current->Link;
}
}

int main()
{
cout<<"请输入链表的元素(以0结束):";
List List;
List.input();
List.output();
return 0;
}
不过修改后运行时你会发现你的程序还有别的问题,应该是指针和内存方面的,再好好调试下吧

网友(2):

编译器错误 C2228

错误消息
“.identifier”的左侧必须有类/结构/联合
句点 (.) 左边的操作数不是类、结构或联合。

下面的示例生成 C2228:
// C2228.cpp
int i;
struct S {
public:
int member;
} s, *ps = &s;

int main() {
i.member = 0; // C2228 i is not a class type
ps.member = 0; // C2228 ps is a pointer to a structure

s.member = 0; // s is a structure type
ps->member = 0; // ps points to a structure S
}

如果在使用托管扩展时使用了错误的语法,则也将显示此错误。而在其他 Visual Studio 语言中,可以使用点运算符访问托管类的成员,在 C++ 中指向对象的指针意味着必须使用 -> 运算符访问该成员:
错误:String * myString = checkedListBox1->CheckedItems->Item[0].ToString();
正确:String * myString = checkedListBox1->CheckedItems->Item[0]->ToString();