Doxygen for C ++模板类成员专门化

时间:2010-03-24 08:58:21

标签: doxygen template-specialization

当我编写类模板,并且需要对这些类的成员进行完全特化时,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>,所有这些都使它看起来好像是在使用相同的模板。非常尴尬,感觉就像一个kludge解决方案。

连连呢?非常感谢:)。

- 谢夫

2 个答案:

答案 0 :(得分:13)

进一步寻求表明此问题是an open bug,已在Doxygen 1.8.10中修复。

答案 1 :(得分:1)

此错误似乎在3周前修复