c++ error C2228的解决办法
发布网友
发布时间:2023-08-22 12:50
我来回答
共2个回答
热心网友
时间:2023-08-31 23:33
就这个程序而言,你的错误有两个,一是link有的是大写有的小写,前后不一,编译器不识别,二是List<int> List();这句话应该这样:List<int> List;这才真正创建了一个对象List,如下修改:
#include <iostream>
using namespace std;
template <class T>
struct LinkNode{
T data;
LinkNode<T> *Link;
LinkNode(LinkNode<T> *ptr=NULL){Link=ptr;}
LinkNode(const T& item,LinkNode<T> *ptr=NULL)
{
data=item; Link=ptr;
}
};
template<class T>
class List{
public:
List(){first=new LinkNode<T>;}
List(const T&x){first=new LinkNode<T>(x);}
//List(List<T>& L);
~List(){makeEmpty();}
void makeEmpty();
LinkNode<T>* Locate(int i);
bool Insert(int i,T&x);
bool Remove(int i,T&x);
void input();
void output();
protected:
LinkNode<T>*first;
};
template<class T>
void List<T>::makeEmpty()
{
LinkNode<T> *q;
while (first->Link!=NULL)
{
q=first->Link;
first->Link=q->Link;
delete q;
}
}
template<class T>
LinkNode<T> *List<T>::Locate(int i)
{
if(i<0) return NULL;
LinkNode<T> *current=first; int k=0;
while (current!=NULL&&k<i)
{
current=current->Link; k++;
}
return current;
}
template<class T>
bool List<T>::Insert(int i,T&x)
{
LinkNode<T>* current=Locate(i);
if (current=NULL) return false;
LinkNode<T>* newNode=new LinkNode<T>(x);
if (newNode==NULL){cerr<<"存储分配错误!"<<endl;exit(1);}
newNode->Link=current->Link;
current->Link=newNode;
return true;
}
template<class T>
bool List<T>::Remove(int i,T&x)
{
LinkNode*current=Locate(i-1);
if (current==NULL ||current->Link==NULL) return false;
LinkNode<T>*del=current->Link;
current->Link=del->Link;
x=del->data;
delete del;
return true;
}
template <class T>
void List<T>::output()
{
LinkNode<T>*current=first->Link;
while (current!=NULL)
{
cout<<current->data<<endl;
current=current->Link;
}
}
template<class T>
void List<T>::input()
{
LinkNode<T>*current=first->Link;
while(current->data!=0)
{
cin>>current->data;
current=current->Link;
}
}
int main()
{
cout<<"请输入链表的元素(以0结束):";
List<int> List;
List.input();
List.output();
return 0;
}
不过修改后运行时你会发现你的程序还有别的问题,应该是指针和内存方面的,再好好调试下吧
热心网友
时间:2023-08-31 23:34
编译器错误 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();