可能重复:
c ++将const对象引用传递给函数
void SpectrumAnalyserThread::calculateFFT(AnalogData &frame, const QByteArray &playbackBuffer)
{
fft->window(frame.data(),frame.size());
fft->fix_fftr(frame.data(), qFloor(log(frame.size()) / log(2)), 0);
for(int i = 0; i < m_numSamples; ++i)
{
m_output.push_back(frame[i]);
}
fft->fix_fftr(m_output.data(), qFloor(log(m_output.size()) / log(2)), 0);
const QByteArray ba((const char*)m_output.data(), sizeof(ushort));
const_cast<QByteArray &>(playbackBuffer);
playbackBuffer.append(ba);
m_output.clear();
calculateMagnitude(frame);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: passing 'const QByteArray' as 'this' argument of 'QByteArray& QByteArray::append(const QByteArray&)' discards qualifiers [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
如果我做了功能常量则在抛出错误
m_output.clear(),m_output.push_back(),这是显而易见的,但我需要清除缓冲区,这样当函数被再次调用以前的数据不会被追加.
如果要修改playbackBuffer,则应将参数作为非const参数:
QByteArray &playbackBuffer
Run Code Online (Sandbox Code Playgroud)
这完全独立于是否SpectrumAnalyserThread声明了成员函数const(如果它修改了this'内部状态则不应该这样).
请注意,此行无效.要使用演员表的结果,你必须对它做点什么.单独使用强制转换的语句只执行转换,然后抛弃转换的结果.
const_cast<QByteArray &>(playbackBuffer);
Run Code Online (Sandbox Code Playgroud)
您可以执行类似下面的操作,但它会冒未定义的行为,并且滥用您与函数调用者签订的合同,您可以通过const参考来说明您不会修改playbackBuffer.
const_cast<QByteArray &>(playbackBuffer).append(ba);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13350 次 |
| 最近记录: |