Doxygen抱怨使用相同模板但具有不同模板参数的重载函数

时间:2017-02-01 18:35:57

标签: c++ doxygen

[编辑提供最小的设置来重现问题。]

我有与此类似的C ++代码(file.h):

namespace xxx {
  template< typename T >
  class Array {};

  using sint = std::ptrdiff_t;
  using uint = std::size_t;
  using dfloat = double;
  using IntegerArray = Array< xxx::sint >;
  using UnsignedArray = Array< xxx::uint >;
  using FloatArray = Array< xxx::dfloat >;
}

/// \brief A namespace
namespace yyy {
namespace {

  /// \brief A function
  inline out* function( xxx::UnsignedArray const& in ) {}

  /// \brief A function
  inline out* function( xxx::IntegerArray const& in ) {}

  /// \brief A function
  inline out* function( xxx::FloatArray const& in ) {}

  /// \brief A class
  class AAA {
    public:
      /// \brief A class method
      out* function( xxx::BBB const& bbb ) {}
};
}}

Doxyfile是:

OUTPUT_DIRECTORY       = out
EXTRACT_ANON_NSPACES   = YES
INPUT                  = .
FILE_PATTERNS          = *.h

Doxygen抱怨:

Searching for member function documentation...
/Users/cris/tmp/doxygenissue/file.h:25: warning: no matching class member found for 
  out *anonymous_namespace file yyy::anonymous_namespace{file.h}::yyy::h::function(xxx::IntegerArray const &in)

/Users/cris/tmp/doxygenissue/file.h:28: warning: no matching class member found for 
  out *anonymous_namespace file yyy::anonymous_namespace{file.h}::yyy::h::function(xxx::FloatArray const &in)

它似乎没有看到第二和第三个功能。只有第一个出现在文档中。生成此错误需要匿名命名空间,具有相同名称的方法的类也是如此。

有人知道解决方法吗?除了更改类方法的名称,即......

2 个答案:

答案 0 :(得分:1)

我发现一种相当丑陋的方法可以使它起作用,直到在Doxygen中修复该错误为止。看来至少对我来说有效。我想它会影响某些链接,但是,在这一点上,我认为我更希望获得每个函数的预期描述,而不是拥有适当的链接和名称空间名称。

我想到了Doxygen接受预处理器选项的事实,该选项可用于添加特定于Doxygen的#define。这是我的doxygen.h标头:

#ifndef DOXYGEN_HPP
#define DOXYGEN_HPP

#ifdef DOXYGEN
#define no_name             doxygen
#else
#define no_name
#endif

#endif

我们可以看到,我定义了一个名为no_name的宏,当我用Doxygen 编译时,将其设置为doxygen,否则它将保持为空。

现在在我的C ++文件中:

...
namespace no_name
{
    // static code goes here
    ...
} // no name namespace
...

因此,现在使用g++进行编译时,我没有得到预期的名称。但是,当使用Doxygen进行编译时,命名空间的名称为doxygen,我不再遇到该错误。

要使此魔术起作用,还需要调整doxy文件。以下是相关选项:

MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = YES
PREDEFINED             = DOXYGEN=1
EXPAND_AS_DEFINED      = no_name

您可能还需要修复包含路径。包含doxygen.h文件非常重要。我有CMake,所以对我来说很容易:

INCLUDE_PATH           = @CMAKE_SOURCE_DIR@

到目前为止,我还没有发现任何严重损坏的地方。所以我猜这是一个不错的中间解决方案。

另一件事,请确保INHERIT_DOCSNO,因为默认情况下为YES,这意味着您仍将获得基类描述。

答案 1 :(得分:0)

在重载函数时,应该使用/ overload关键字来为重载函数添加文档。

template<typename T> class Array;
using UnsignedArray = Array<unsigned>
using IntegerArray = Array<int>
using FloatArray = Array<float>

 /// \overload brief A function
void function(UnsignedArray const&);

/// \overload brief A function
void function(IntegerArray const&);

/// \overload brief A function
 void function(FloatArray const&);

这将有助于doxygen单独记录它们