1

这是涉及的两个功能:

int FixedLengthRecordFile :: write (const int numRec, const FixedLengthFieldsRecord & rec)
{
    /*** some code ***/

    return rec.write(file); // FILE* file is an attribute of FixedLengthRecordFile
}


int FixedLengthFieldsRecord :: write (FILE* file) { /* ... code ... */ }

我得到这个错误:

FixedLengthRecordFile.cpp: In member function ‘int FixedLengthRecordFile::write(int, const FixedLengthFieldsRecord&)’:
FixedLengthRecordFile.cpp:211:23: error: no matching function for call to ‘FixedLengthFieldsRecord::write(FILE*&) const’
FixedLengthRecordFile.cpp:211:23: note: candidate is:
FixedLengthFieldsRecord.h:35:7: note: int FixedLengthFieldsRecord::write(FILE*) <near match>
FixedLengthFieldsRecord.h:35:7: note:   no known conversion for implicit ‘this’ parameter from ‘const FixedLengthFieldsRecord*’ to ‘FixedLengthFieldsRecord*’
FixedLengthRecordFile.cpp:213:1: warning: control reaches end of non-void function [-Wreturn-type]

错误的原因是什么?我在代码中没有看到任何错误。此外,我还有另外两个类似的功能(写),它工作得很好。

4

2 回答 2

3
int FixedLengthRecordFile::write( const int numRec, 
                                  const FixedLengthFieldsRecord& rec)
{
   /*** some code ***/

    return rec.write(file); // FILE* file is an attribute of FixedLengthRecordFile
}


int FixedLengthFieldsRecord::write(FILE* file) 

您通过constconst引用传递参数,但是,rec.write(file)您调用的函数不是const函数,它可能会修改那些传入的对象,因此编译器会抱怨。

您应该执行以下操作:

   int FixedLengthFieldsRecord::write(FILE* file)  const  
       // add const both declaration and definition ^^^
于 2013-04-03T03:34:38.360 回答
0

让我们看看错误信息:

FixedLengthFieldsRecord.h:35:7:note: int FixedLengthFieldsRecord::write(FILE*)<near match>
FixedLengthFieldsRecord.h:35:7:note:   no known conversion for implicit ‘this’ parameter
    from ‘const FixedLengthFieldsRecord*’ to ‘FixedLengthFieldsRecord*’

它说它不能进行从const FixedLengthFieldsRecord*到的转换FixedLengthFieldsRecord*

这是一个很好的提示。

在下面的行中,rec是 const 引用,

return rec.write(file); // FILE* file is an attribute of FixedLengthRecordFile

但以下功能不合格 const

int FixedLengthFieldsRecord :: write (FILE* file) { /* ... code ... */ }

因此问题!

有(至少)两种解决方案:

1) 更改rec为非const参考

write()2) 更改要const限定的方法的签名

选项#2 是首选方法。

于 2013-04-03T03:41:42.307 回答