CLDOC 在模板部分专用化时崩溃
cldoc crashes on template partial specialization
这个问题被标记为不清楚我在问什么。 为了清楚起见,我要求一种解决方法,以使此文档生成器针对我的代码库正常工作。 (也许将作业分成几批? 这在 cldocs 中可能吗? 也许发布不同的命令行选项? 也许我的调用是错误的或被误导的?
我已经针对该项目提交了一个错误,您可以在此处找到有关我的环境的一些其他信息(包括位于此处的完整命令行:http://pastebin.com/JxWf9hRB)。
https://github.com/jessevdk/cldoc/issues/73
原始问题:
我正在研究使用 cldocs 进行自动化文档。 但是,它在我的代码库上崩溃,并出现以下错误:
Traceback (most recent call last):
File "/usr/local/bin/cldoc", line 9, in <module>
load_entry_point('cldoc==1.6', 'console_scripts', 'cldoc')()
File "/usr/local/lib/python2.7/site-packages/cldoc/__init__.py", line 57, in run
run_generate(rest)
File "/usr/local/lib/python2.7/site-packages/cldoc/__init__.py", line 27, in run_generate
cmdgenerate.run(args)
File "/usr/local/lib/python2.7/site-packages/cldoc/cmdgenerate.py", line 151, in run
run_generate(t, opts)
File "/usr/local/lib/python2.7/site-packages/cldoc/cmdgenerate.py", line 33, in run_generate
generator.generate(xmlout)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 55, in generate
Generator.generate(self, outdir)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/generator.py", line 22, in generate
self.generate_node(node)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 543, in generate_node
self.generate_page(node)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 510, in generate_page
elem = self.node_to_xml(node)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 496, in node_to_xml
chelem = self.node_to_xml(child)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 485, in node_to_xml
self.call_type_specific(node, elem, 'to_xml')
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 465, in call_type_specific
getattr(self, nm)(node, elem)
File "/usr/local/lib/python2.7/site-packages/cldoc/generators/xml.py", line 273, in method_to_xml
if len(node.override) > 0:
File "/usr/local/lib/python2.7/site-packages/cldoc/nodes/method.py", line 43, in override
bases = list(self.parent.bases)
AttributeError: 'Namespace' object has no attribute 'bases'
编辑:
经过很长一段时间,我已经能够将其缩减为一个最小的例子。
template<typename T>
struct Foo {
int baz(T const& t) const { }
};
template<typename T, int N>
class Bar { };
template<typename T, int N>
struct Foo<Bar<T, N>> {
int baz(Bar<T, N> const& a) const;
};
template<typename T, int N>
int Foo<Bar<T, N>>::baz(Bar<T, N> const& a) const { }
而这有效:
template<typename T>
struct Foo {
int baz(T const& t) const { }
};
template<typename T, int N>
class Bar { };
template<typename T, int N>
struct Foo<Bar<T, N>> {
int baz(Bar<T, N> const& a) const { }
};
首先,cldoc
依赖于 clang 来解析源代码,它需要适当的 C/C++ 标志(例如 -std=c++11
)才能正常运行。
然后,即使有适当的标志,它也会在某些看起来有效的结构上爆炸。特别是,它尝试使用看似错误的上下文处理模板类方法定义。特别是Foo<Bar<T, N>>::baz()
定义的问题在于,在处理过程中,其self.parent
等于Root
或Namespace
对象(显然没有"bases"属性,也不应该有),而不是Class
或类似的对象,bases
用于跟踪特定方法的覆盖列表。
我已经为该问题准备了一种解决方法,它只是在爆炸时"放松"了具有self.parent
属性的操作,并将其作为对该问题的评论发布。但这肯定不是解决方案。也许一个正确的解决方案应该首先决定是否必须以这种方式处理此类类外方法定义,可能正确的方法是仅在方法声明中处理覆盖列表。
这是补丁:
diff --git a/cldoc/nodes/method.py b/cldoc/nodes/method.py
index f910241..3e1208f 100644
--- a/cldoc/nodes/method.py
+++ b/cldoc/nodes/method.py
@@ -40,7 +40,7 @@ class Method(Function):
return self._override
# Lookup in bases, recursively
- bases = list(self.parent.bases)
+ bases = list(getattr(self.parent, "bases", []))
mname = self.name
self._override = []
- 当回溯以零开始时,如何调试崩溃
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 模板专用化(按容器):value_type
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 静态数据成员模板专用化的实例化点在哪里
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- CLDOC 在模板部分专用化时崩溃