2

私がやりたいのは、条件が満たされた場合に、構造のベクトル上の構造の1つのフィールドを置き換えることです。だからここに私のコードがあります:

struct DataST{
    int S_num,Charge,Duplicate_Nu;
    float PEP;
    string PEPTIDE;
    vector<MZIntensityPair> pairs;
    bool GetByT(const DataST& r,int T)
    {
      switch (T)
      {
          case 1:
            return (S_num == r.S_num);
          case 2:
            return (Charge == r.Charge);
          case 3:
            return !(PEPTIDE.compare(r.PEPTIDE));
          case 4:
            return (Duplicate_Nu == r.Duplicate_Nu);
          case 5:
            return ((S_num == r.S_num)&&(Charge == r.Charge));
          default:
            return false;
      }
    }
  };
int main()
{
 .
 .
 vector<DataST> spectrums;
 .
 .
 DataST tempDT_dup;
 tempDT_dup.PEPTIDE="Test";
 replace_if(spectrums.begin(), spectrums.end(), boost::bind(&DataST::GetByT, _1,tempDT_dup,3),11);
 .
 .
}

したがって、この例では、スペクトルアイテムのすべてのDuplicate_Nuを11に変更したいのですが、そのアイテムのPEPTIDEファイルが "test"に等しい場合、操作 "="の代わりに関数GetByTを使用したいときに、以下のエラーが発生しました。

/usr/include/c++/4.6/bits/stl_algo.h:4985:4:エラー:'_ firstの'operator='に一致しません。_gnu_cxx :: __ normal_iterator <_Iterator、_Container> :: operator * with _Iterator = DataST *、_Container = std :: vector、__gnu_cxx :: __ normal_iterator <_Iterator、_Container> :: reference = DataST&= __new_value 4.6 / bits / stl_algo.h:4985:4:注:候補は:hello_pwiz / hello_pwiz.cpp:14:8:注:DataST&DataST :: operator =(const DataST&)hello_pwiz / hello_pwiz.cpp:14:8:注:'int DataST ::*const'から'constDataST&'への引数1の既知の変換はありません</ p>

4

1 に答える 1

4

これまでの問題は、コピーできないオブジェクトをコピーで渡そうとしていることです。これは、引数として指定したものがすべてboost::bind()コピーされるためです。

boost::bind(&DataST::GetByT, _1,tempDT_dup,3),
                                 /|\
                                  |
  This means pass by copy. --------

コピーを渡したくない場合は、ポインターを渡す必要があります(ポインターをコピーしても害はありません)。boost::refまたは、次のように参照して渡すために使用することもできます。

boost::bind(&DataST::GetByT, _1,boost::ref(tempDT_dup),3),

もう1つの問題は11、の最後の引数として指定することですstd::replace_if()。これは、要素を置き換える必要がある値です(述語が返される場合true)。配列に格納されているオブジェクトと同じタイプである必要があります(または変換可能である必要があります)。11ただし、 (プレーン符号付き整数別名int)を型のオブジェクトに変換することはできませんDataST。次のようなものが必要です。

vector<DataST> spectrums;
DataST tempDT_dup;
DataST replacee; // What you want to replace with...
replace_if(spectrums.begin(), spectrums.end(),
           bind(&DataST::GetByT, _1, boost::ref(tempDT_dup), 3),
                replacee);
于 2012-11-30T14:45:02.803 に答える