【问题标题】:Doxygen report "potential recursive class relation"Doxygen 报告“潜在的递归类关系”
【发布时间】:2011-07-07 00:22:26
【问题描述】:

我有一个 C++ 模板类 base::Foo<class T>,我在另一个文件中有一个类 base::bar::Foo : public base::Foo<Baz>。 Doxygen 似乎不喜欢这样,因为它会引发错误

<unknown>:1: Detected potential recursive class relation between class snLib::mocTwod::DsaCell and base class DsaCell< snLib::mocTwod::ProblemTraits, detLib::cellDiffusionTwod::ProblemTraits >!

有没有办法防止这种情况发生? Doxygen 的文档没有讨论这个错误或任何关于“潜在递归类关系”的内容。

“基”类:

/*! \file snlib/DsaCell.hpp
 */
#ifndef snlib_DsaCell_hpp
#define snlib_DsaCell_hpp
#include "Dsa.hpp"

namespace snLib {
/*!
 * \brief  Implementation of naive cell-centered DSA
 */
template <class HoTraits_T, class LoTraits_T>
class DsaCell : public snLib::Dsa< HoTraits_T, LoTraits_T >
{
    [snip]
};
}
#endif

导致问题的后代之一:

/*! \file snlib/twod/moc/DsaCell.hpp
 */
#ifndef snlib_twod_moc_DsaCell_hpp
#define snlib_twod_moc_DsaCell_hpp
#include "snlib/DsaCell.hpp"

#include "ProblemTraits.hpp"
#include "detlib/twod/celldiffusion/ProblemTraits.hpp"

namespace snLib { namespace mocTwod {
/*!
 * \brief Inconsistent DSA for MOC
 */
class DsaCell : public snLib::DsaCell<
                        snLib::mocTwod::ProblemTraits,
                        detLib::cellDiffusionTwod::ProblemTraits
                        >
{
    [snip]
};
} } // end namespace snLib::mocTwod
#endif

我的Doxygen配置文件有很多选项设置,包括路径配置:STRIP_FROM_PATH(设置为根目录)、STRIP_FROM_INC_PATH(同)、INCLUDE_PATH(同)。

编辑:看起来错误实际上是在另一个 Doxyfile 中引发的,该 Doxyfile 使用了名称冲突的那个生成的 XML 标签,所以问题与此有关。无论如何,我只是将基类重命名为其他东西,一切都很好。

【问题讨论】:

  • 报告一个错误,但真正的嵌套名称允许冲突,以适应不同团队的异步开发。即使语言允许,仍然不鼓励故意重复使用相同的名称。
  • 您应该发布您的确切代码,而不是它的合成版本。您是否完全符合基类的条件?
  • @Ben:谢谢你的建议;我可能只是重命名基类。
  • @David:我想我会先发布一个一般性描述,以防这是一个已知问题,因为人们通常对大块代码犹豫不决。 :P 我会更新我的答案,但我怀疑它会很有帮助。
  • @Seth Johnson:你用的是什么 doxygen 版本?

标签: c++ doxygen


【解决方案1】:

Doxygen 有一个检查类 A 和 B 是否有继承关系的功能 (直接或间接),这是递归的。该函数检查限制深度为 256 的递归。

可能 doxygen 与您的代码混淆(因为名称巧合)并认为 A 类依赖于 B 而 B 又依赖于 A。

这可能是一个 Doxygen 错误,但最好的方法是重命名类。

【讨论】:

  • 限制您选择类名以响应劣质工具对我来说似乎是个坏主意。
  • @JohnMcFarlane 您是否进行了一些研究并测试了当前 doxygen 版本的问题?您是否能够重现旧的(doxygen 1.7.2)行为?请显示您用于重现问题的代码。
  • @albert Reproduction of failure with 1.8.11Branch used to reproduce。已确认版本 1.8.13。
  • 我刚刚尝试使用 1.8.11、1.8.13 版本和主版本,将存储库(开发分支)作为给定并采用干净的 Doxyfile(仅将 RECURSIVE 设置为 YES 并在一份文件)。并获得了两个版本 3“递归”警告,但没有在“使用 1.8.11 重现故障”中指出。文件 include/cnl/_impl/integer/numeric_limits.h 在我的情况下只有 31 行,我需要一个特殊的分支吗?
  • 我得到的第一个递归警告是:include/cnl/rounding_integer.h:270: warning: Detected potential recursive class relation between class std::numeric_limits&lt; cnl::rounding_integer&lt; Rep, RoundingTag &gt; &gt; and base class numeric_limits&lt; cnl::rounding_integer&lt; Rep, RoundingTag &gt; &gt;!
猜你喜欢
  • 2016-01-08
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2019-01-09
  • 2017-10-04
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多