2

ここには明らかに何かが欠けていますが、何ですか?

定義 (...実際の 3 つのポイントではなく、有効なコードを示します):

class CrmxFile {
private:
    const std::vector<std::string> validValues;
    int value;

public:
    void setValue(std::string _value);

...
}

std::vector<std::string> CrmxFile = {...};

コードで私はこれを持っています:

void Crmx::SetValue(std::string _value) {
    std::vector<std::string>::iterator idx;
    if((idx = std::find(validValues.begin(), validValues.end(), _value)) == validValues.end()) {
        value = 0;
    }
    else {
        value = idx - validValues.begin();
    }
}

これをコンパイルするとgcc -c -std=c++0x、次のエラーが発生します。

CrmxFile.cpp: In member function ‘void CrmxFile::SetValue(std::string)’:
CrmxFile.cpp:24:64: error: no match for ‘operator=’ in ‘idx = std::find [with _IIter = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >, _Tp = std::basic_string<char>](Id3V1::validValues.std::vector<_Tp, _Alloc>::begin [with _Tp = std::basic_string<char>, _Alloc = std::allocator<std::basic_string<char> >, std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_pointer = const std::basic_string<char>*](), Id3V1::validValues.std::vector<_Tp, _Alloc>::end [with _Tp = std::basic_string<char>, _Alloc = std::allocator<std::basic_string<char> >, std::vector<_Tp, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >, typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::const_pointer = const std::basic_string<char>*](), (*(const std::basic_string<char>*)(& _value)))’
CrmxFile.cpp:24:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note: __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >& __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >::operator=(const __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&)
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note:   no known conversion for argument 1 from ‘__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >’ to ‘const __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&’
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note: __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >& __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >::operator=(__gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&&)
/usr/include/c++/4.6/bits/stl_iterator.h:702:11: note:   no known conversion for argument 1 from ‘__gnu_cxx::__normal_iterator<const std::basic_string<char>*, std::vector<std::basic_string<char> > >’ to ‘__gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >&&’

私は何が欠けていますか?または、代わりに、ベクトル内の特定の値のインデックスを見つけるより良い方法はありますか?

4

4 に答える 4

5

idxは である必要がconst_iteratorあり validValuesますconst vector<...>

std::vector<std::string>::const_iterator idx;
于 2013-01-08T17:59:21.077 に答える
1

「何が足りないの?」

あなたの最初のvalidValuesは無効ですか?

私は提案します:

void Crmx::SetValue(std::string _value) {

        value = std::find(validValues.begin(), validValues.end(), _value) - validValues.begin();

}

そして、validValues.sizeを0ではなく無効な値として使用します

于 2013-01-08T18:41:24.990 に答える
1

validValuesconstbegin()、であるためend()、 のこのインスタンス化はstd::findすべて を返しstd::vector<std::string>::const_iterator、 ではありませんstd::vector<std::string>::iterator。const 安全のために、 aconst_iteratorは に変換できませんiterator

于 2013-01-08T18:02:04.830 に答える
1

validValuesとして定義されconst std::vector<std::string>ます。したがってbegin()end()は を返しconst_iteratorますが、結果を に代入しようとしていますiteratorconst_iteratoraを anに変換すると、 iteratorconst の正確性が損なわれるため (その後で基になるオブジェクトを変更できるため)、許可されません。

の定義idx を be に変更するとstd::vector<std::string>::const_iterator、機能するはずです。

于 2013-01-08T18:02:23.023 に答える