如何将C ++ 11循环转换为传统循环?

时间:2014-05-22 10:22:24

标签: c++ c++11

我在我的程序错误C2143中出现此错误:语法错误:在':'之前缺少',',我正在使用Visual c ++ express 2010,我认为在VC 2010中支持C ++ 11。

可以somone请修改此代码并解释如何在传统的for循环中恢复此for循环? ouFlexSignalInfo是来自c ++ stl

的列表数据类型
for(auto ouSignalInfo : ouFlexSignalInfo)   //C++11;
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = ouSignalInfo.m_omEnggValue.c_str();
    ouSignal.m_omRawValue = ouSignalInfo.m_omRawValue.c_str();
    ouSignal.m_omSigName = ouSignalInfo.m_omSigName.c_str();
    ouSignal.m_omUnit = ouSignalInfo.m_omUnit.c_str();
    ouSignal.m_msgName=ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add(ouSignal);
}

2 个答案:

答案 0 :(得分:3)

大致相当于:

auto iterBegin = std::begin(ouFlexSignalInfo);
auto iterEnd = std::end(ouFlexSignalInfo);

for(; iterBegin != iterEnd; ++iterBegin)
{
    auto ouSignalInfo = *iterBegin;
    //the rest of body
}

iterBeginiterEnd是从ouFlexSignalInfo成员beginend返回的迭代器。

这种循环适用于具有开始和结束成员的所有内容

答案 1 :(得分:0)

如果使用MS VC ++ 2010,则编译器支持基于范围的for循环的MS语言扩展。代码将采用以下方式

for each ( auto ouSignalInfo in ouFlexSignalInfo )
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = ouSignalInfo.m_omEnggValue.c_str();
    ouSignal.m_omRawValue = ouSignalInfo.m_omRawValue.c_str();
    ouSignal.m_omSigName = ouSignalInfo.m_omSigName.c_str();
    ouSignal.m_omUnit = ouSignalInfo.m_omUnit.c_str();
    ouSignal.m_msgName=ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add(ouSignal);
}

或者写出

会更好
for each ( const auto &ouSignalInfo in ouFlexSignalInfo )
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = ouSignalInfo.m_omEnggValue.c_str();
    ouSignal.m_omRawValue = ouSignalInfo.m_omRawValue.c_str();
    ouSignal.m_omSigName = ouSignalInfo.m_omSigName.c_str();
    ouSignal.m_omUnit = ouSignalInfo.m_omUnit.c_str();
    ouSignal.m_msgName=ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add(ouSignal);
}

由于ouFlexSignalInfo的类型未知,因此您可以使用迭代器。例如

#include <iterator>

for ( auto it = std::begin( ouFlexSignalInfo ); it != std::end( ouFlexSignalInfo ); ++it )
{
    SSignalInfo ouSignal;
    ouSignal.m_omEnggValue = it->m_omEnggValue.c_str();
    ouSignal.m_omRawValue = it->m_omRawValue.c_str();
    ouSignal.m_omSigName = it->m_omSigName.c_str();
    ouSignal.m_omUnit = it->m_omUnit.c_str();
    ouSignal.m_msgName = ouFrame.m_strFrameName.c_str();
    SigInfoArray.Add( ouSignal );
}