2012-12-22 26 views
0

我有两个并行类,一个解析.xlsx文件,另一个解析xls文件。 我自己写了xlsx解析器,但是从另一个xls解析器继承来适合我的类模型。到现在为止还挺好。在C++中没有名称的模板类

这两个类最终使用同一段代码使用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; 
    } 
}; 
+2

我绝对相信,如果我们可以在这个头文件中看到第370行[也许5-10行以上],那么解决这个问题会容易得多... –

+0

对不起。等一下。 –

+0

你走了。添加了失败的位。 –

回答

1

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

这一结论可以通过下面的推导过程可以达到:

  • 无论是XLS和XLSX解析器使用rapidjson.h头文件,但只有XLS解析器(它使用外部库)有问题,所以外部图书馆是一个促成因素。
  • 来自编译器的错误消息指示文本UTF16以某种方式消失。
  • 代码段

    #ifdef UTF16 
    #error 
    #endif 
    

    由于脱扣上#error指令产生错误。这两个表明一个名为UTF16的预处理器marco正在运行。

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

  • 重新排序#include指令,从而致使宏存在的头被列入后rapidjson.h
  • 添加到rapidjson.h头的开始行

    #undef UTF16 
    

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

注意,包括后卫不禁agains这样的问题,因为它是通过干扰两种不同的标题之间引起的(从甚至不同的库),不会因为一个头得到多次使用(这是什么头卫兵保护你)。

+0

哇。接受的答案。 –

0

我要在这里写这篇文章的后人,并记在经验不足。

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

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

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