我有两个并行类,一个解析.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;
}
};
答案 0 :(得分:1)
问题的根本原因是外部xls解析器正在使用扩展为空字符串的宏UTF16
。
通过以下演绎过程可以得出这个结论:
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中删除它解决了这个问题。
我不明白的是,我认为包括警卫应该阻止这一点。