15

当我编写类模板并且需要完全特化这些类的成员时,Doxygen 无法识别特化——它只记录泛型定义,或者(如果只有特化)最后一个定义。这是一个简单的例子:

===MyClass.hpp===

#ifndef MYCLASS_HPP
#define MYCLASS_HPP

template<class T> class MyClass{
public:
    static void foo();
    static const int INT_CONST;
    static const T TTYPE_CONST;
};

/* generic definitions */
template<class T>
void MyClass<T>::foo(){
    printf("Generic foo\n");
}

template<class T>
const int MyClass<T>::INT_CONST = 5;

/* specialization declarations */
template<> void MyClass<double>::foo();
template<> const int MyClass<double>::INT_CONST;
template<> const double MyClass<double>::TTYPE_CONST;
template<> const char MyClass<char>::TTYPE_CONST;

#endif

=== MyClass.cpp ===

#include "MyClass.hpp"

/* specialization definitions */
template<>
void MyClass<double>::foo(){
    printf("Specialized double foo\n");
}

template<> const int MyClass<double>::INT_CONST = 10;

template<> const double MyClass<double>::TTYPE_CONST = 3.141;
template<> const char MyClass<char>::TTYPE_CONST = 'a';

因此,在这种情况下,foo() 将被记录为打印“Generic foo”,INT_CONST 将被记录为设置为 5,没有提及专业化,而 TTYPE_CONST 将被记录为设置为“a”,没有提及3.141 并且没有表明“a”是特殊情况。

我需要能够记录专业化 - 无论是在文档中MyClass<T>,还是在新页面上MyClass<double>MyClass<char>。我该怎么做呢?Doxygen 甚至可以处理这个问题吗?我可能在声明/代码结构中做错了什么,使 Doxygen 无法理解我想要的东西吗?

我应该注意两个相关的案例:

A) 对于模板化函数,专业化工作正常,例如:

/* functions that are global/in a namespace */
template<class T> void foo(){ printf("Generic foo\n"); }
template<> void foo<double>(){ printf("Specialized double foo\n"); }

这将同时记录foo<T>()foo<double>()

B)如果我重新声明整个模板,即template<> class MyClass<double>{...};,那么MyClass<double>将获得它自己的文档页面,作为一个单独的类。但这意味着实际上声明了一个全新的类——如果声明了自身MyClass<T>,则两者之间没有关系。所以我必须重新声明这个类和它的所有成员,重复所有类成员的定义,专门为,所有这些都让它看起来好像它们使用的是相同的模板。非常尴尬,感觉就像一个杂乱无章的解决方案。MyClass<double>MyClass<double>MyClass<double>

建议?非常感谢 :)

--Ziv

4

2 回答 2

13

进一步寻找表明这个问题是一个开放的错误,在 Doxygen 1.8.10 中修复。

于 2010-03-28T13:35:10.590 回答
1

此错误似乎已在 3 周前修复

于 2015-07-17T20:23:13.673 回答