0

.xlsx ファイルを解析するクラスと xls ファイルを解析するクラスの 2 つの並列クラスがあります。xlsx パーサーは自分で作成しましたが、別の xls パーサーから継承してクラス モデルに適合させました。ここまでは順調ですね。

どちらのクラスも、db に挿入するための json 配列を作成するために、rapidjson を使用して同じコードを使用することになります。ただし、xlsx 側ではすべてが機能しますが、xls 側では、rapidjson ライブラリを含めて使用すると、次のエラーが発生します。

excelparser/lib/rapidjson/rapidjson.h:370:1: error: template class without a name

xls.cpp からすべてのコードを削除し、xls.h に単純な #include のみを残しても、同じエラーが発生します。

ヘッダー ファイルの行は次のとおりです。

//! UTF-16 encoding.
/*! http://en.wikipedia.org/wiki/UTF-16
    \tparam CharType Type for storing 16-bit UTF-16 data. Default is wchar_t. C++11 may use char16_t instead.
    \implements Encoding
*/
template<typename CharType = wchar_t>
struct UTF16 {                                    // <-- Line 370
    typedef CharType Ch;

    static Ch* Encode(Ch* buffer, unsigned codepoint) {
        if (codepoint <= 0xFFFF) {
            RAPIDJSON_ASSERT(codepoint < 0xD800 || codepoint > 0xDFFF); // Code point itself cannot be surrogate pair 
            *buffer++ = static_cast<Ch>(codepoint);
        }
        else {
            RAPIDJSON_ASSERT(codepoint <= 0x10FFFF);
            unsigned v = codepoint - 0x10000;
            *buffer++ = static_cast<Ch>((v >> 10) + 0xD800);
            *buffer++ = (v & 0x3FF) + 0xDC00;
        }
        return buffer;
    }
};
4

2 に答える 2

1

この問題の根本原因は、外部の xls パーサーがUTF16空の文字列に展開するマクロを使用していることです。

この結論は、次の演繹プロセスを通じて到達できます。

  • xls パーサーと xlsx パーサーの両方がrapidjson.hヘッダー ファイルを使用しますが、(外部ライブラリを使用する) xls パーサーだけに問題があるため、外部ライブラリが要因となります。
  • コンパイラからのエラー メッセージは、テキストUTF16が何らかの形で消えたことを示しています。
  • コード スニペット

    #ifdef UTF16
    #error
    #endif
    

    #errorディレクティブでのトリップによりエラーが発生します。これらはどちらも、名前を持つプリプロセッサ marco が動作していることを示していUTF16ます。

この種のエラーを解決するには、いくつかの方法があります。

  • #includeマクロを存在させるヘッダーが の後に含まれるように、ディレクティブを並べ替えrapidjson.hます。
  • rapidjson.hヘッダーの先頭に行を追加します

    #undef UTF16
    

    ファイルの処理時にマクロが存在しないことを確認します。

インクルード ガードは、この種の問題に対しては役に立たないことに注意してください。これは、単一のヘッダーが複数回使用されたからではなく、2 つの異なるヘッダー間の干渉によって引き起こされるためです (これは、ヘッダー ガードが保護するものです)。

于 2012-12-22T17:16:46.600 に答える