Doxygen抱怨递归C ++类

时间:2015-10-10 13:24:23

标签: c++ templates doxygen

我有一个简单的递归模板,它实现了Euclid算法的优化版本。 Doxygen抱怨它:

/usr/home/kamikaze/stark/Yggdrasil/src/units/Units.hpp:335: warning: Detected potential recursive class relation between class units::euclid and base class units::euclid< Rhs, Lhs%Rhs >!

/usr/home/kamikaze/stark/Yggdrasil/src/units/Units.hpp:335: warning: Detected potential recursive class relation between class units::euclid and base class euclid< Rhs, Lhs%Rhs >!

/usr/home/kamikaze/stark/Yggdrasil/src/units/Units.hpp:335: warning: Detected potential recursive class relation between class units::euclid and base class units::euclid< Rhs, Lhs%Rhs >!

/usr/home/kamikaze/stark/Yggdrasil/src/units/Units.hpp:335: warning: Detected potential recursive class relation between class units::euclid and base class euclid< Rhs, Lhs%Rhs >!

我傻眼了为什么这是一个投诉/警告。我认为递归类型是常见的和合法的。它也是许多递归模板中的一个,但是唯一一个doxygen抱怨的。 令我惊讶的是,我只发现了类似的问题,其中doxygen错误地检测了递归。

如果您有兴趣,请输入以下代码:

/**
 * Implements Euclid's algorithm to find the GCD between two integers.
 *
 * @tparam Lhs,Rhs
 *  The values to get the GCD for
 */
template <int Lhs, int Rhs>
struct euclid : euclid<Rhs, Lhs % Rhs> {
};

/**
 * Terminates Euclid's algorithm.
 *
 * @tparam Gcd
 *  The GCD to return
 * @see euclid
 */
template <int Gcd>
struct euclid<Gcd, 0> {
    /**
     * The GCD of the two original values.
     */
    static constexpr int const value{Gcd};
};

3 个答案:

答案 0 :(得分:4)

这个结构确实超出了doxygen的解析功能。

由于这个类的用户不知道它是以递归方式实现的,因此您可以使用以下解决方法:

/**
 * Implements Euclid's algorithm to find the GCD between two integers.
 *
 * @tparam Lhs,Rhs
 *  The values to get the GCD for
 */
template <int Lhs, int Rhs>
struct euclid /** @cond */ : euclid<Rhs, Lhs % Rhs> /** @endcond */ {
  /** @cond */
};

template <int Gcd>
struct euclid<Gcd, 0> {
  /** @endcond
   * The GCD of the two original values.
   */
  static constexpr int const value {Gcd};
};

答案 1 :(得分:2)

如果事先声明模板会有所不同吗?在定义时,唯一可能的基类确实是递归的。我会像这样组织代码,不仅仅是为了让Doxygen高兴,而且因为我还首先建立了与基本案例的数学归纳和递归关系:

// forward declaration
template <int Lhs, int Rhs>
struct euclid;

// base case
template <int Gcd>
struct euclid<Gcd, 0>
{
    static constexpr int const value{Gcd};
};

// recurrence relation
template <int Lhs, int Rhs>
struct euclid : euclid<Rhs, Lhs % Rhs>
{
};

答案 2 :(得分:0)

默认情况下,doxygen没有完整的C ++解析器。所以它可能会错误地获得有效的C ++代码。

doxygen 1.8.4开始,有可能configure使用来自Clang的C ++解析器,它应该解析大部分真实的C ++代码。