模板化C++类具有"预期的非限定 id"

Templated C++ class has an 'expected unqualified-id'

本文关键字:id C++      更新时间:2023-10-16

对于类作业,我们必须将 STL 向量写入模板化的 .h 文件中。我尝试运行它,除了赋值错误的重载之外,我的所有成员函数都可以工作。它位于最底部,是倒数第二个成员函数。当接到任务时,我被要求超载Vector<T>& operator=(const Vector&v)

template <class T>
class Vector{
    private:
    int current_size, capacity;
    T* arr;
    public:
    Vector();
    ~Vector();
    unsigned int size();
    void grow(); //where does this belong?
    void push_back(const T& elt);
    void pop_back();
    T& at(int pos);
    T& front();
    T& back();
    bool empty();
    void insert (const T&elt, int pos);
    void erase(int pos);
    Vector<T>& operator=(const Vector& v);
    T& operator[](int n);
    };
    template <class T>
    Vector<T>& Vector<T>::operator=(const Vector& v){
    current_size= v.size();
    capacity= v.capacity();
    }

错误是"预期的非限定 id",出现错误的行是:
"Vector& Vector::operator=(const Vector& v)"{

这段代码有很多很多问题。

Zeroth,您的缩进样式使阅读代码变得非常困难。每次打开新范围时,缩进!

首先,定义成员函数:

template <class T>
typename Vector<T>::T& at(int pos)
template <class T>
Vector<T>:: T& back()

正确的语法是 return-type class-name::member-name 。所以这些应该是:

template <class T>
T& Vector<T>::at(int pos)
template <class T>
T& Vector<T>::back()

第二,deletearr是动态数组T。只有它是动态的。在多个位置,您尝试删除单个元素:

delete arr[current_size-1];

这是一个无效的操作。

第三,对于您的具体问题,参数vconst

template <class T>
Vector<T>& Vector<T>::operator=(const Vector<T>& v){

这意味着您只能调用const限定成员函数。 size()不符合const资格。您必须添加:

unsigned int size() const;
                   ^^^^^^

之后,capacity不是成员函数,它只是一个成员:

capacity= v.capacity();
                    ^^

在那之后,你的复制赋值运算符也需要实际复制所有元素 - 否则它不是真的......复制任何实质性的东西。