关于模板数组的=操作符重载的问题

kallr 2004-09-06 04:30:14
我事先声明了一个模板数组类
template<class T> class ZArray
{
public:
ZArray(void);
~ZArray();

T *m_pData; // pointer to data Array
int m_nSize;

ZArray<T>& operator =(ZArray<T>& a);
T& operator[](int index);

int GetSize(void) { return(m_nSize); }
};
类ClassA
typedef ZArray<ClassA> myClass;
现在我向重载myClass的operaotr= (const char* strData)
myClass& myClass::operator= (const char* strData)
{
.....
return *this;
}
这样为声明编译通不过???
...全文
178 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwertasdfg123 2004-09-07
  • 打赏
  • 举报
回复

OrgJInfoArr& OrgJInfoArr::operator (conat char* strData)
{
..............//把字符串解析成OrgJInfoArr数组;
return *this;
}
放到data.h中吧。
模板的定义和实现最好放在一个文件中。


kallr 2004-09-07
  • 打赏
  • 举报
回复
我在 data.h里面写的:
template<class T> class ZArray
{
public:
ZArray(void);
ZArray(int nSize);

~ZArray();

T *m_pData; // pointer to data Array
int m_nSize;
int RealSize; // number of data, but not the actual valid number of data
// just the memory space of the array
int m_bMalloced;

static int m_nDefaultSize;

ZArray<T>& operator =(ZArray<T>& a);
ZArray<T>& operator =(const char* strData);

T& operator[](int index);

int GetSize(void) { return(m_nSize); }
int Resize(int size);
int GetRealSize(void){return RealSize; }

static void SetDefaultSize(int size) { m_nDefaultSize = size; }

};

template<class T> int ZArray<T>::m_nDefaultSize =500;

/***********************************************
* constructor
***********************************************/
template<class T> ZArray<T>::ZArray(void)
{
m_nSize=0;
m_pData = NULL;
m_bMalloced=0;
RealSize=0;
}

template<class T> ZArray<T>::ZArray(int nSize)
{
m_nSize = nSize;
m_pData = new T[m_nSize];
m_bMalloced = 1;
RealSize=0;
}

/***********************************************
* Destructor
***********************************************/
template<class T> ZArray<T>::~ZArray()
{
if(m_bMalloced)
delete[] m_pData;
}


/***********************************************
* resize
***********************************************/
template<class T> int ZArray<T>::Resize(int size)
{
if(size<=0)
{
return 0;

}
else if(size!=m_nSize)
{
T *pData = new T[size];

//Remain the requested size of data if already malloced.
if(m_bMalloced)
{
if(size>m_nSize)
{
memcpy(pData, m_pData, m_nSize * sizeof(T));
}
else
{
memcpy(pData, m_pData, size * sizeof(T)); //当size>m_nSize时出错
}
delete[] m_pData;
}
m_pData = pData;
m_nSize=size;
m_bMalloced=1;
}
return(m_nSize);
}

/**********************************************************
* operator = as member function
**********************************************************/
template<class T> ZArray<T>& ZArray<T>::operator =(ZArray<T>& a)
{
if(a.m_bMalloced)
{
Resize(a.GetSize());
memcpy(m_pData, a, m_nSize*sizeof(T));
}
return(*this);
}

template<class T> ZArray<T>& ZArray<T>::operator =(const char* strData)
{
return *this;
}
/**********************************************************
* operator [] as member function
**********************************************************/
template<class T> T& ZArray<T>::operator[](int index)
{
if(m_bMalloced == 0)
{
m_nSize=m_nDefaultSize;
m_pData = new T[m_nSize];
m_bMalloced=1;
}

if(index<=0)
{
return(m_pData[0]);
}
else if (m_nSize < index)
{
T* pData = new T[index + m_nDefaultSize/2];
memcpy(pData, m_pData, m_nSize*sizeof(T));

Resize(index + m_nDefaultSize/2);

memcpy(m_pData, pData , m_nSize*sizeof(T));

delete[] pData;
}

if(RealSize<index)
RealSize=index;

return(m_pData[index-1]);
}

struct OrgJInfo //节点初始信息
{
int J; //节点编号
double DX; //节点水平位移(m)
double DY; //节点竖向位移(m)
OrgJInfo();
};

typedef ZArray<OrgJInfo> OrgJInfoArr;

在data.cpp里面
OrgJInfoArr& OrgJInfoArr::operator (conat char* strData)
{
..............//把字符串解析成OrgJInfoArr数组;
return *this;
}
在应用程序里面使用
OrgJInfoArr tempClass;
tempClass = ".............. ";//给数组赋值
qwertasdfg123 2004-09-07
  • 打赏
  • 举报
回复
能不能把代码贴出来看看
kallr 2004-09-07
  • 打赏
  • 举报
回复
那返回声明类型??
MyClass& MyClass::operator= (const char* strData)
{
return *this;
}
是不是在模板类中的函数该成虚函数呀
template<class T> virtual ZArray<T>& ZArray<T>::operator =(const char* strData)
{
.....
}
qwertasdfg123 2004-09-07
  • 打赏
  • 举报
回复
operator=的返回类型不对。
xspspring 2004-09-07
  • 打赏
  • 举报
回复
MARK
kallr 2004-09-07
  • 打赏
  • 举报
回复
C2040: ZArray<T>::operator'=' :'int (const char*)' differs in levels of indirection from ZArray<T>& (const char*)'
qwertasdfg123 2004-09-06
  • 打赏
  • 举报
回复
我用vc6、gcc通过。
把错误贴出来吧。
kallr 2004-09-06
  • 打赏
  • 举报
回复
vc7.1呀
qwertasdfg123 2004-09-06
  • 打赏
  • 举报
回复
编译器是哪种?
kallr 2004-09-06
  • 打赏
  • 举报
回复
我是这样写的但是编译同不个呀
qwertasdfg123 2004-09-06
  • 打赏
  • 举报
回复
是不是这样:
template<class T> class ZArray
{
public:
ZArray(void){}
~ZArray(){}

T *m_pData; // pointer to data Array
int m_nSize;

ZArray<T>& operator =(ZArray<T>& a);
T& operator[](int index);

int GetSize(void) { return(m_nSize); }
ZArray<T>& operator= (const char* strdata);

};

class ClassA;
typedef ZArray<ClassA> myClass;

myClass& myClass::operator= (const char* strData)
{
return *this;
}
kallr 2004-09-06
  • 打赏
  • 举报
回复
我的意思是我要该掉赋值操作符,参数是char*
就是我要用字符串来给一个对象数组赋值呀
ZArray<ClassA>& ZArray<ClassA>::operator= (const char* strdata)
{
};
yjh1982 2004-09-06
  • 打赏
  • 举报
回复
某些编译器是编译不过啊.
还是用古典写法吧.
template<class T>
ZArray <T>& ZArray<T> ::operator= (ZArray<T> &right)
{
.....
return *this;
}
qwertasdfg123 2004-09-06
  • 打赏
  • 举报
回复
class ClassA;
typedef ZArray<ClassA> myClass;

class ClassA: public myClass
{
public:
ClassA()
{
}
~ClassA()
{
}
ClassA& operator= (const char* strData)
{

return *this;
}
};
kallr 2004-09-06
  • 打赏
  • 举报
回复
大侠帮帮忙呀

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧