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

3
我在我程序中使用了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: 实例化自 void 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成员 'const std::string User::NAME',无法使用默认赋值运算符
我的程序中有类"User"和"Users":
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);

这段代码可以正常工作,但是它阻止我向“用户”向量数组中添加新记录。如果有人能告诉我原因,我将不胜感激。谢谢。


1
可能是[非静态const成员,无法使用默认赋值运算符]的重复问题。 (https://dev59.com/a3RB5IYBdhLWcg3wZmhz) - Patrick B.
2个回答

7

您需要提供一个拷贝构造函数才能使用 push_back,因为您的类包含一个非静态的 const 成员。

您可以通过使用 getter 方法轻松解决此问题:

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

@MichalArtazov:不客气。然而,如果你使用拷贝构造函数的方法,请不要忘记实现赋值运算符,因为你可能会意外地使用它。 - Zeta

2

大多数情况下,编译器会为您提供一个复制赋值运算符,但由于您有一个常量成员变量,因此编译器无法这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接