1

g++ 4.7.2 を使用して、2003 年に最後に更新されたステガノグラフィ パッケージをコンパイルしようとしています。ヘッダー ファイルには、次のステートメントがあります。

typedef AudioDataImpl<AuMuLaw,BYTE> AuMuLawAudioData;
inline BYTE AuMuLawAudioData::readValue(BinaryIO *) const {return (io->read8());}

さまざまな形式のデータを読み書きするための同様のステートメントが他にもいくつかあります。コンパイルすると、次のエラー メッセージが生成されます。

AuData.h:29:13: エラー: 特殊化メンバー 'AudioDataImpl::readValue' には 'template<>' 構文が必要です。

繰り返しになりますが、このようなエラー メッセージは、ヘッダー ファイルの各行に対して生成されます。

最初は、コンパイラがテンプレートを適切に特殊化しているように見える typedef ステートメントを無視していると思っていたので、typedef 値を実際のテンプレート式に置き換えましたが、同じエラーが発生したため、問題を引き起こしているのは typedef 自体ではありません。2003 年から現在にかけてテンプレートの処理が変更されたため、このコードはコンパイルされなくなりましたか?

4

1 に答える 1

4

コードが厳密に準拠したコンパイラで以前にコンパイルされていない可能性があります。

各行を次のように置き換えます。

template<> inline BYTE AuMuLawAudioData::readValue(BinaryIO *) const {return (io->read8());}

そしてそれはうまくいくはずです。はtypedefシンボルAuMuLawAudioDataにのみ影響し、宣言全体の構文は変更されないためtypedef<>、テンプレートの特殊化であることを示す必要があります。

于 2013-03-11T16:45:09.117 に答える