1

関係する 2 つの機能は次のとおりです。

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]

エラーの原因は何ですか? コードに問題はありません。その上、他に 2 つの同様の関数 (書き込み) があり、問題なく動作します。

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 ... */ }

したがって、問題!

(少なくとも) 2 つの解決策があります。

1)recconst参照への変更

2)修飾するwrite()メソッドの署名を変更するconst

オプション #2 が推奨される方法です。

于 2013-04-03T03:41:42.307 に答える