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: instantiated fromvoid からインスタンス化 std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = ユーザー、_Alloc = std::アロケーター]'

main.cpp:100: ここからインスタンス化

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/vector.tcc:238: エラー: 非静的 const メンバー `const std::string User::NAME', can'デフォルトの代入演算子を使用しない

クラス「ユーザー」と「ユーザー」があります。

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);
}

2行目を消すと

users.push_back(newUser);

正常に動作しますが、「users」ベクトル配列に新しいレコードを追加できないため、ご覧のようには動作しません。どなたか原因を教えていただけると助かります。ありがとう

4

2 に答える 2

5

push_backクラスに非静的constメンバーが含まれているため、を使用するにはコピーコンストラクターを提供する必要があります。

代わりにゲッターを使用することで、これを簡単に修正できます。

class User{
public:
    string NAME() const { return m_name; }
    /* ... */
private:
    string m_name;
    /* ... */
};
于 2013-03-30T21:58:07.523 に答える
2

ほとんどの場合、コンパイラはコピー代入演算子を提供しますが、const メンバ変数があるため、コンパイラがこれを行うことはできません。

于 2013-03-30T22:02:11.497 に答える