我是c ++的新手,无法弄清楚为什么这不起作用。
我收到错误:
3 LNK2019: unresolved external symbol errors for:
operator<<, public: __thiscall Array<int>::Array<int>(void), and public: virtual __thiscall Array<int>::~Array<int>(void)
我正在尝试创建一个简单的Array类。
我认为它与我的包含或命名空间等有关。这里是代码:
#include <iostream>
#include "Array.h"
using namespace std;
int main()
{
Array<int> ai;
cout << ai << endl;
return 0;
}
抽象基类
#ifndef ABSTRACTARRAY_H
#define ABSTRACTARRAY_H
#include <iostream>
using namespace std;
class Exception {};
class ArrayException : public Exception{};
class ArrayMemoryException : public ArrayException {};
class ArrayBoundsException : public ArrayException {};
template <class DataType>
class AbstractArray
{
public:
virtual int getSize() const = NULL;
virtual DataType& operator[](int k) = NULL;
};
#endif // ABSTRACTARRAY_H
数组类标题
#ifndef ARRAY_H
#define ARRAY_H
#include "AbstractArray.h"
const int ARRAY_DEFAULT_SIZE = 1;
template <class DataType>
class Array : virtual public AbstractArray<DataType>
{
friend ostream& operator<< (ostream& s, Array<DataType>& ac);
protected:
DataType* paObject;
int size;
void copy(const Array<DataType>& ac);
public:
Array();
Array(int n);
Array(int n, const DataType& val);
Array(const Array<DataType>& ac);
virtual ~Array();
virtual int getSize() const;
virtual DataType& operator[](int k);
void operator=(const Array<DataType>& ac);
};
#endif // ARRAY_H
数组类cpp
#include "Array.h"
template <class DataType>
Array<DataType>::Array()
{
size = 0;
paObject = new DataType[ARRAY_DEFAULT_SIZE];
if (paObject == NULL)
{
throw ArrayMemoryException();
}
size = ARRAY_DEFAULT_SIZE;
}
template <class DataType>
Array<DataType>::Array(int n)
{
size = 0;
paObject = new DataType[n];
if (paObject == NULL)
{
throw ArrayMemoryException();
}
size = n;
}
template <class DataType>
Array<DataType>::Array(int n, const DataType& val)
{
size = 0;
paObject = new DataType[n];
if (paObject == NULL)
{
throw ArrayMemoryException();
}
size = n;
for (int i = 0; i < n; i++)
{
paObject[i] = val;
}
}
template <class DataType>
Array<DataType>::Array(const Array<DataType>& ac)
{
if (&ac != this)
{
copy(ac);
}
}
template <class DataType>
Array<DataType>::~Array()
{
if (paObject != NULL)
{
delete[] paObject;
}
size = 0;
paObject = NULL;
}
template <class DataType>
void Array<DataType>::copy(const Array<DataType>& ac)
{
size = 0;
paObject = new DataType[ac.size];
if (paObject == NULL)
{
throw ArrayMemoryException();
}
for (int i = 0; i < size; i++)
{
paObject[i] = ac.paObject[i];
}
}
template <class DataType>
int Array<DataType>::getSize() const
{
return size;
}
template <class DataType>
DataType& Array<DataType>::operator[](int k)
{
if (k < 0 || k >= size)
{
throw ArrayBoundsException();
}
return paObject[k];
}
template <class DataType>
void Array<DataType>::operator=(const Array<DataType>& ac)
{
if (&ac != this)
{
if (paObject != NULL)
{
delete[] paObject;
copy(ac);
}
}
}
template <class DataType>
ostream& operator<< (ostream& s, Array<DataType>& ac)
{
s << "[";
for (int i = 0; i < ac.getSize(); i++)
{
if (i > 0)
{
s << ",";
}
s << ac[i];
}
s << "]";
return s;
}
感谢所有人的帮助,谢谢。