使用vector :: push_back()方法时C ++向量编译错误

时间:2013-03-30 21:53:50

标签: c++ vector compiler-errors

我在我的程序中使用了std :: vector,编译时遇到了这个错误:

  

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c ++ / bits / vector.tcc:在成员函数`User& User :: operator =(const User&)':

     

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c ++ / bits / vector.tcc:238:从void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = User, _Alloc = std::allocator<User>]' /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_vector.h:564: instantiated from实例化void std :: vector&lt; _Tp,_Alloc&gt;: :push_back(const _Tp&amp;)[with _Tp = User,_Alloc = std :: allocator]'

     

main.cpp:100:从这里实例化

     

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c ++ / bits / vector.tcc:238:错误:非静态const成员`const std :: string User :: NAME' ,不能使用默认赋值运算符

我有“用户”和“用户”类:

class User {
    public:
        const string NAME;

        User(const string &name, const bool &isMain = false) : NAME(name), isMain(isMain) {};
        void addFollower(User * user);
        void addReplier(User * user, const int &count);
        void addMentioner(User * user, const int &count);
        void addRetweeter(User * user, const int &count);

    private:
        vector<User *> followedBy, repliedBy, mentionedBy, retweetedBy;
        vector<int> replyCount, mentionCount, retweetCount;
        bool isMain;
    };


class Users {
    public:
        vector<User> users;

        void addUser(const string &name, bool isMain = false);
        User * findUser(const string &name);
        friend ostream & operator <<(ostream &outStream, const Users &users);
        User & operator [] (unsigned int index);
    };

这是事情。该错误是由方法Users :: addUser():

引起的
void Users::addUser(const string &name, bool isMain) {
    User newUser(name, isMain);
    users.push_back(newUser);
}

如果我删除第二行

users.push_back(newUser);

它工作正常,但是,它不像你看到的那样工作,因为它阻止我将新记录添加到“users”向量数组中。如果有人告诉我原因是什么,我会感恩的。感谢

2 个答案:

答案 0 :(得分:5)

您必须提供复制构造函数才能使用push_back,因为您的类包含非静态const成员。

您可以使用getter轻松解决此问题:

class User{
public:
    string NAME() const { return m_name; }
    /* ... */
private:
    string m_name;
    /* ... */
};

答案 1 :(得分:2)

大多数情况下,编译器会为您提供一个复制赋值运算符,但由于您有一个const成员变量,编译器无法执行此操作。