我正在將Visual Studio 2008 VC++項目遷移到Visual Studio 2013.遷移我的其中一個項目時出現錯誤C3892。這裏是一個重現問題的一些示例代碼:錯誤VS2013中的c3892迭代器問題
int _tmain(int argc, _TCHAR* argv[])
{
struct student
{
int id;
int marks;
bool changed;
bool operator < (const student& refParam) const
{
return false ;
}
student(int a,int b)
{
id=a;
marks=b;
changed=true;
}
};
student x(10,500),y(15,600);
std::multiset<student> myset;
myset.insert(x);
myset.insert(y);
std::multiset<student>::reverse_iterator iter;
for (iter=myset.rbegin(); iter != myset.rend(); ++iter)
{
std::cout<<iter->id<<"\n";
std::cout<<iter->marks<<"\n";
std::cout<<iter->changed<<"\n";
iter->changed=false;
}
return 0;
}
試圖編譯上面拋出Error:
error C3892: 'std::_Revranit<_RanIt,_Base>::operator ->' : you cannot assign to a variable that is const
然而,同樣的代碼沒有錯誤編譯在Visual Studio 2008中我應該改變在我的項目中的價值?
'operator <'不符合'std :: set'的嚴格弱順序要求。實現一個除了總是返回'false'之外的東西。並且在C++ 11中'set'的迭代器更改爲引用常量元素而非非常量,這會導致您的錯誤。 – WhozCraig
@WhozCraig'返回std :: tie(id,mark,changed)
@Joker_vD如果我需要三個人的話,我不會這樣做。 「std :: tie」就是那些貓的鬍鬚。 – WhozCraig