重载自定义向量类中的和运算符



作为学习c++动态内存分配的练习,我正在编写自己的vector类。我在重载求和运算符时遇到了一点困难,所以我想我应该在这里深入了解一下为什么它不起作用。以下是目前为止的内容:

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错误,当我试图编译这段代码,这(据我所知)意味着有一个函数声明的地方,我没有实际定义。我不确定问题在哪里,然而:template<typename A> vector(const A&)构造函数工作得很好。我错过了什么?

您没有正确地将模板操作符函数列为好友。有多种方法可以做到这一点,每种方法都有其优点。一种是世界之友的意识形态,在这种意识形态中,模板的所有扩展都是彼此的朋友。我喜欢更严格一点。

你的vector类上面,这样做:

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:无效的引用返回值固定在上面的代码。

最新更新