0

何らかの理由で、作成したマップから整数のベクトルを取得できません。このベクトルを新しいベクトルで上書きできるようにしたいと考えています。コンパイラが私に与えるエラーはばかげています。ご協力いただきありがとうございます!!

コンパイラは私のコードのこの部分を気に入らなかった:

line_num = miss_words[word_1];

エラー:

[Wawiti@localhost Lab2]$ g++ -g -Wall *.cpp -o lab2
main.cpp: In function ‘int main(int, char**)’:
main.cpp:156:49: error: no match for ‘operator=’ in ‘miss_words.std::map<_Key, _Tp, _Compare, _Alloc>::operator[]<std::basic_string<char>, std::vector<int>, std::less<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, std::vector<int> > > >((*(const key_type*)(& word_1))) = line_num.std::vector<_Tp, _Alloc>::push_back<int, std::allocator<int> >((*(const value_type*)(& line)))’
main.cpp:156:49: note: candidate is:
In file included from /usr/lib/gcc/x86_64-redhat->linux/4.7.2/../../../../include/c++/4.7.2vector:70:0,
                 from header.h:19,
                 from main.cpp:15:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/vector.tcc:161:5: note: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = int; _Alloc = std::allocator<int>]
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/vector.tcc:161:5: note:   no known conversion for argument 1 from ‘void’ to ‘const std::vector<int>&’

コード:

map<string, vector<int> > miss_words;       // Creates a map for misspelled words
string word_1;                  // String for word;
string sentence;                // To store each line;
vector<int> line_num;               // To store line numbers

ifstream file;                  // Opens file to be spell checked
file.open(argv[2]);

int line = 1;
while(getline(file, sentence))          // Reads in file sentence by sentence
{
    sentence=remove_punct(sentence);    // Removes punctuation from sentence
    stringstream pars_sentence;     // Creates stringstream
    pars_sentence << sentence;      // Places sentence in a stringstream
    while(pars_sentence >> word_1)      // Picks apart sentence word by word
    {
        if(dictionary.find(word_1)==dictionary.end())
        {
            line_num = miss_words[word_1]; //Compiler doesn't like this
            miss_words[word_1] = line_num.push_back(line);
        }       
    }
line++;                     // Increments line marker
}
4

3 に答える 3

1

いいえ、コンパイラはあなたが考えた後の行について不平を言っています:

miss_words[word_1] = line_num.push_back(line);

関数は をstd::vector::push_back()返しますvoid。それを に割り当てることはできませんvector

ベクトルをコピーして値をプッシュし、それをコピーして戻す代わりに、直接プッシュしてみませんか。

miss_words[word_1].push_back(line);
于 2013-07-02T22:52:20.967 に答える
0
line_num = miss_words[word_1]; // use assignment operator to assign value at key word_1 to line_num
miss_words[word_1] = line_num.push_back(line); // trying to reset the value at key word_1

RyanMcK が述べたように、push_back は void を返します。

上記の 2 行を書き直します (より単純で正しく、代入演算子を使用してデータをコピーしていません)。

miss_words[word_1].push_back(line) // directly access the value at key word_1

std::map::operator[] がマップされた値への参照を返すため、これは機能します。

ソース:

http://www.cplusplus.com/reference/vector/vector/push_back/

http://www.cplusplus.com/reference/map/map/operator[]/

于 2013-07-02T23:01:35.020 に答える
0

ベクターのコピーを作成していますが、これは不要です。

line_num = miss_words[word_1];

代わりに次のようにする必要があります。

std::vector<int> &v = miss_words[word_1];
v.push_back(line);

これは、RyanMck が指摘した同じ問題にも対処する必要があります。

于 2013-07-02T22:51:50.963 に答える