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