如何解决链接错误:在这种特殊情况下未解析的外部符号

时间:2014-09-27 19:16:23

标签: c++ lnk2019

我是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;
}

感谢所有人的帮助,谢谢。

0 个答案:

没有答案