0

我有两个并行类,一个解析 .xlsx 文件,一个解析 xls 文件。我自己编写了 xlsx 解析器,但继承自另一个 xls 解析器以使其适合我的类模型。到现在为止还挺好。

两个类最终都使用同一段代码,使用 rapidjson 创建一个 json 数组以插入到数据库中。但是,在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指令跳闸而产生错误。这两个都表明具有该名称的预处理器 marcoUTF16正在发挥作用。

有几种方法可以解决这些类型的错误:

  • 重新排序#include指令,以使导致宏存在的标头包含在rapidjson.h.
  • 将行添加到rapidjson.h标题的开头

    #undef UTF16
    

    以确保在处理文件时宏不存在。

请注意,包含保护无法解决此类问题,因为它是由两个不同的标头(甚至来自不同的库)之间的干扰引起的,而不是因为单个标头被多次使用(这是标头保护保护您的原因)。

于 2012-12-22T17:16:46.600 回答
0

我将在这里为后代写这个,并将其归结为缺乏经验。

我完全忘记的关键细节是,由于指针相关的原因,这两个类都继承了一个名为电子表格的纯虚拟类。

将 #include "rapidjson.h" 添加到 spreadsheet.h 并将其从 xls.h 和 xlsx.h 中删除即可解决问题。

我不明白的是,我认为包括警卫应该防止这种情况发生。

于 2012-12-22T16:54:22.577 回答