我想要做的就是在条件满足时替换结构向量上的一个结构域。所以这是我的代码:
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);
.
.
}
因此,在本次考试中,如果该项目的PEPTIDE字段等于“test”,我希望将所有Duplicate_Nu的频谱项目更改为11,但是当我想使用函数GetByT代替操作“=”时我得到了错误
/ usr / include / c ++ / 4.6 / bits / stl_algo.h:4985:4:错误:首先在'_ 中与'operator ='不匹配。 _gnu_cxx :: __ normal_iterator&lt; _Iterator, _Container&gt; :: operator * with _Iterator = DataST *,_ _Container = std :: vector,__ gn_cxx :: __ normal_iterator&lt; _Iterator,_Container&gt; :: reference = DataST&amp; = __new_value' /usr/include/c++/4.6/bits/stl_algo.h:4985:4:注意:候选人是: hello_pwiz / hello_pwiz.cpp:14:8:注意:DataST&amp; DataST :: operator =(const DataST&amp;) hello_pwiz / hello_pwiz.cpp:14:8:注意:没有已知的从'int DataST :: * const'到'const DataST&amp;'的参数1的转换
答案 0 :(得分: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),
另一个问题是您指定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);