在c ++中没有名称的模板类

时间:2012-12-22 16:08:55

标签: c++

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

两个类最终都使用相同的代码使用rapidjson创建一个json数组以插入到db。但是,在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;
    }
};

2 个答案:

答案 0 :(得分:1)

问题的根本原因是外部xls解析器正在使用扩展为空字符串的宏UTF16

通过以下演绎过程可以得出这个结论:

  • xls和xlsx解析器都使用rapidjson.h头文件,但只有xls解析器(使用外部库)存在问题,因此外部库是一个影响因素。
  • 来自编译器的错误消息表明文本UTF16以某种方式消失了。
  • 代码段

    #ifdef UTF16
    #error
    #endif
    

    由于#error指令跳闸而产生错误。这两个都表明名为UTF16的预处理器marco正在发挥作用。

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

  • 重新排序#include指令,以便在rapidjson.h之后包含导致宏存在的标头。
  • rapidjson.h标题的开头添加

    #undef UTF16
    

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

请注意,include guard不能再帮助解决这类问题,因为它是由两个不同标头之间的干扰引起的(甚至来自不同的库),不是因为单个标头被多次使用(这就是标头保护你的保护对)。

答案 1 :(得分:0)

我打算在这里为后人写这篇文章,并将其归结为缺乏经验。

我完全忘记的关键细节是两个类都继承了一个名为spreadsheet的纯虚拟类,这与指针相关。

将#include“rapidjson.h”添加到spreadsheet.h并从xls.h和xlsx.h中删除它解决了这个问题。

我不明白的是,我认为包括警卫应该阻止这一点。