在自定义向量类中重载Sum运算符

时间:2014-08-19 00:43:05

标签: c++

作为练习在C ++中学习更多关于动态内存分配的练习,我正在研究自己的vector类。我在重载sum运算符时遇到了一些困难,所以我想我会转到这里来了解为什么这不起作用。这是我到目前为止所做的:

template<typename T>
class vector
{
private:
    T* pointer_;
    unsigned long size_;
public:
    // Constructors and destructors.
    vector();
    template<typename A> vector(const A&);
    template<typename A> vector(const A&, const T&);
    vector(const vector<T>&);
    ~vector();

    // Methods.
    unsigned long size();
    T* begin();
    T* end();
    vector<T>& push_back(const T&); 

    // Operators.
    T operator[](unsigned long);
    vector<T>& operator=(const vector<T>&);
    friend vector<T>& operator+(const vector<T>&, const vector<T>&);
};

template<typename A> vector(const A&)构造函数如下所示:

template<typename T> template<typename A>
vector<T>::vector(const A& size)
{
    this->pointer_ = new T[size];
    this->size_ = size;
}

最后,operator+运算符如下所示:

template<typename T>
vector<T>& operator+(const vector<T>& lhs, const vector<T>& rhs)
{
    vector<T> result(lhs.size_);
    for (unsigned long i = 0; i != result.size_; i++)
    {
        result.pointer_[i] = lhs.pointer_[i] + rhs.pointer_[i];
    }
    return result;
}

当我尝试编译此代码时,我的编译器(VS2013)会返回unresolved external symbol错误,(据我理解)这意味着there's a function declared somewhere that I haven't actually defined.我不确定问题出在哪里,但是: template<typename A> vector(const A&)构造函数工作正常。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您没有正确地为模板操作员功能提供信息。有多种方法可以做到这一点,每种方法都有优势。一个是朋友世界的意识形态,模板的所有扩展都是彼此的朋友。我宁愿比那更具限制性。

上面你的矢量类,执行以下操作:

template<typename T>
class vector;

template<typename T>
vector<T> operator+(const vector<T>& lhs, const vector<T>& rhs);

像以前一样继续,但请注意朋友声明中的语法:

// vector class goes here....
template<typename T> class vector
{
    .... stuff ....

   friend vector<T> operator+<>(const vector<T>&, const vector<T>&);
};

然后定义其余部分。这应该会让你得到我认为你想要实现的目标。

祝你好运。

PS:在上面的代码中修复了无效的引用返回值。