功能移动无法解决,语义错误

时间:2017-05-23 07:26:36

标签: c++11 c++14 move

以下程序应该模拟std :: vector。我正在使用Eclipse IDE for C / C ++ Developers 版本:Neon.3发布(4.6.3) 构建ID:20170314-1500

我的c ++版本是g ++(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609

标记错误“函数std :: move无法解析”。

出现此错误的可能原因是什么?

//============================================================================
// Name        : data_structure_1.cpp
// Author      : Manish Sharma
// Description : Programme to implement a simple vector class named "Vector".
// Reference   : Data Structures and Algo. analysis in c++, Mark Allen Weiss
//============================================================================

#include <iostream>
#include <algorithm>

using namespace std;

template<class Object>
class Vector{
public:
    // constructor
    explicit Vector(int initSize = 0):
        theSize{initSize},
        theCapacity{initSize + SPARE_CAPACITY},
        objects{new Object[theCapacity]}{
        }
    // copy constructor
    Vector(const Vector& rhs):
        theSize{rhs.theSize},
        theCapacity{rhs.theCapacity},
        objects{new Object[theCapacity]}{
            for(int k = 0;k<theSize; ++k){
                objects[k] = rhs.objects[k];
            }
        }
    // copy assignment operaor
    Vector & operator= (const Vector & rhs){
        Vector copy = rhs;
        std::swap(*this,copy);
        return *this;
    }
    //class destructor
    ~Vector(){
        delete[] objects;
    }

    //c++ 11 additions, reference to rvalues

    Vector(Vector&& rhs) :
            theSize{rhs.theSize},
            theCapacity{rhs.theCapacity},
            objects{rhs.objects}{
                cout<<endl<<"Inside lvalue reference constructor";
                //if you forget to include this then when rhs will you destroyed
                //you will be left with a dangling pointer
                rhs.objects = nullptr;
                rhs.theSize = 0;
                rhs.theCapacity = 0;
            }
        // copy assignment operaor
        Vector & operator= (Vector && rhs){
            cout<<endl<<"Inside lvalue reference copy";
            Vector copy = rhs;
            std::swap(*this,copy);
            return *this;
        }
        void resize(int newSize){
            if(newSize > theCapacity)
                reserve(newSize*2);
            theSize = newSize;
        }
        void reserve(int newCapacity){
            if(newCapacity<theSize)
                return;

            Object *newArray = new Object[newCapacity];
            cout<<endl<<"moving inside reserve";
            for(int k=0;k<theSize;++k){
                newArray[k] = std::move(objects[k]);
            }

            theCapacity = newCapacity;
            std::swap(objects,newArray);
            delete[] newArray;
        }

        //Some extra useful functions
        int size() const{
            return theSize;
        }
        bool empty() const{
            return size()==0;
        }
        int capacity() const{
            return theCapacity;
        }
        void increaseCapacity(){
            reserve(2*theCapacity+1);
        }
        //insertion and deletion functions
        void push_back(const Object & x){
            if(theSize == theCapacity){
                increaseCapacity();
            }
            cout<<endl<<"Moving inside push_back";
            objects[theSize++] = std::move(x);
        }
        void pop_back(){
            --theSize;
        }

        using iterator = Object*;
        using const_iterator = const Object*;

        iterator begin(){
            return &objects[0];
        }
        const_iterator begin() const{
            return &objects[0];
        }

        iterator end(){
            return &objects[size()];
        }
        const_iterator end() const{
            return &objects[size()];
        }

    //class specific constants
    static const int SPARE_CAPACITY = 16;
private:
    int theSize;
    int theCapacity;
    Object * objects;
};

int main() {
    Vector<int> my_vector;

    my_vector.push_back(10);
    int j{24};
    my_vector.push_back(j);

    for(int i = 0;i<20;i++){
        my_vector.push_back(i*10);
    }
    cout<<"\nSize = "<<my_vector.size()<<endl;
    my_vector.capacity();

    for(auto it = my_vector.begin();it!=my_vector.end();++it){
        cout<<*it<<", ";
    }
    return 0;
}

0 个答案:

没有答案