2010-03-24 5 views
15

Когда я пишу шаблоны классов и нуждаюсь в полной специализации членов этих классов, Doxygen не признает специализацию - он документирует только общее определение или (если есть только специализации) последнее определение. Вот простой пример:Doxygen для специалиста класса шаблона класса 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() будет быть документировано как печать «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

ответ

13

Далее искание указывает, что этот вопрос был an open bug, зафиксированной в Doxygen 1.8.10.

1

Эта ошибка, кажется, исправлена ​​3 недель назад

Смежные вопросы