2010-03-24 101 views
15

当我编写类模板并需要完全专门化这些类的成员时,Doxygen无法识别专业化 - 它只记录通用定义或(如果只有专业化)最后的定义。这里有一个简单的例子:Doxygen for C++模板类成员专业化

=== 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()还将被记录为打印“通用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<double>本身被声明,MyClass<T>MyClass<double>之间没有关系。因此,我必须重新声明该课程及其所有成员重复所有专门用于MyClass<double>的课程成员的定义,以使其看起来好像他们使用的是相同的模板。非常尴尬,感觉就像一个kludge解决方案。

对此提出建议?谢谢了:)

--Ziv

回答

13

寻求进一步表明,这个问题是an open bug,固定在Doxygen的1.8.10。

1

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