【发布时间】:2014-02-17 05:52:03
【问题描述】:
我正在将 Visual Studio 2008 VC++ 项目迁移到 Visual Studio 2013。在迁移我的一个项目时出现错误 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 C3892: 'std::_Revranit<_RanIt,_Base>::operator ->' : you cannot assign to a variable that is const
但是,相同的代码在 Visual Studio 2008 中编译没有错误。我应该更改项目中的值吗?
【问题讨论】:
-
operator <不符合std::set严格的弱订单要求。实现一个除了总是返回false之外还做一些事情的方法。set的迭代器在 C++11 中更改为引用 const 元素而不是非常量元素,这会导致您的错误。 -
@WhozCraig
return std::tie(id, mark, changed) < std::tie(refParam.id, refParam.mark, refParam.changed)不是最有效的方法,但我想这已经足够了。 -
@Joker_vD 如果我需要订购所有三个,我不会做任何其他方式。
std::tie是猫的胡须。 -
@WhozCraig 好吧,我从来没有真正想知道
a==b是否应该等同于(!(a<b)) && (!(b<a)),所以我总是为operator<写(任意)严格的总订单。 -
@Joker_vD 哈。有趣的。我其实更喜欢它。也许这是在我脑海中的事情,但严格的排序在我的灰质中总是很有效。
标签: c++ visual-c++ visual-studio-2012 stl