【问题标题】:C++ vector compile error, when using vector::push_back() method使用 vector::push_back() 方法时,C++ 向量编译错误
【发布时间】:2013-03-21 08:58:18
【问题描述】:

我在我的程序中使用 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 fromvoid std::vector<_tp _alloc>::push_back (const _Tp&) [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 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);

它工作得很好,但是它不像你看到的那样工作,因为它阻止我将新记录添加到“用户”向量数组中。如果有人告诉我是什么原因,我将不胜感激。谢谢

【问题讨论】:

标签: c++ vector compiler-errors


【解决方案1】:

大多数时候,编译器会为你提供一个复制赋值运算符,但由于你有一个 const 成员变量,编译器不可能这样做。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • @MichalArtazov:不客气。但是,如果您使用复制构造方法,也不要忘记实现赋值运算符,因为您可能会不小心使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    相关资源
    最近更新 更多