2010-03-24 1 views
15

Lorsque j'écris des modèles de classe et que j'ai besoin de spécialiser complètement les membres de ces classes, Doxygen ne reconnaît pas la spécialisation - il documente seulement la définition générique ou (s'il n'y a que des spécialisations) la dernière définition. Voici un exemple simple:Doxygen pour la spécialisation des membres de la classe modèle 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'; 

Donc dans ce cas, foo() sera être documenté comme impression "foo générique", INT_CONST sera documenté comme défini à 5, sans mention des spécialisations, et TTYPE_CONST sera documenté comme étant réglé sur "a", sans mention de 3.141 et aucune indication que "a" est un cas spécialisé.

Je dois être en mesure de documenter les spécialisations - soit dans la documentation pour MyClass<T>, ou sur de nouvelles pages pour MyClass<double>, MyClass<char>. Comment puis-je faire cela? Est-ce que Doxygen peut même gérer ça? Est-ce que je fais quelque chose de mal dans la structure des déclarations/codes qui empêche Doxygen de comprendre ce que je veux?

je devrais noter deux affaires:

A) Pour les fonctions templated, spécialisation fonctionne très bien, par exemple .:

/* 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"); } 

Ce documentera les deux foo<T>() et foo<double>(). B) Si je redéclare le modèle entier, c'est-à-dire template<> class MyClass<double>{...};, alors MyClass<double> obtiendra sa propre page de documentation, en tant que classe séparée. Mais cela signifie en réalité déclarer une classe entièrement nouvelle - il n'y a pas de relation entre MyClass<T> et MyClass<double> si MyClass<double> est elle-même déclarée. Donc, je devrais redéclarer la classe et tous ses membres, et répéter toutes les définitions des membres de la classe, spécialisée pour MyClass<double>, tout pour faire apparaître comme si ils utilisent le même modèle. Très gênant, se sent comme une solution kludge.

Suggestions? Merci beaucoup :)

--Ziv

Répondre

13

En outre la recherche indique que cette question était an open bug, fixé à Doxygen 1.8.10.

1

Ce bug semble être corrigé il y a 3 semaines

Questions connexes