2010-03-24 23 views
15

Cuando escribo plantillas de clase y necesito especializar a los miembros de esas clases, Doxygen no reconoce la especialización; documenta solo la definición genérica o (si solo hay especializaciones) la última definición Aquí hay un ejemplo simple:Doxygen para la especialización de miembro de la clase de plantilla 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'; 

lo tanto, en este caso, foo() lo hará documentarse como impresión "Foo genérico", INT_CONST se documentará como establecido en 5, sin mencionar las especializaciones, y TTYPE_CONST se documentará como 'a', sin mención de 3.141 y sin indicación de que 'a' esté un caso especializado.

Necesito poder documentar las especializaciones, ya sea dentro de la documentación para MyClass<T>, o en páginas nuevas para MyClass<double>, MyClass<char>. ¿Cómo hago esto? ¿Puede Doxygen incluso manejar esto? ¿Acaso estoy haciendo algo mal en la estructura de declaración/código que impide que Doxygen comprenda lo que quiero?

deben tener en cuenta dos casos relacionados:

a) Para las funciones de plantilla, la especialización funciona bien, por ejemplo .:

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

Esto documentará tanto foo<T>() y foo<double>().

B) Si redeclaro la plantilla completa, es decir, template<> class MyClass<double>{...};, entonces MyClass<double> tendrá su propia página de documentación, como una clase separada. Pero esto significa en realidad declarar una clase completamente nueva: no existe relación entre MyClass<T> y MyClass<double> si se declara MyClass<double>. Así que tendría que redeclarar la clase y todos sus miembros, y, repetir todas las definiciones de los miembros de la clase, especializados para MyClass<double>, todos para hacer que parezca que están usando la misma plantilla. Muy incómodo, se siente como una solución de kludge.

Sugerencias? Gracias tanto :)

--Ziv

Respuesta

13

Además búsqueda indica que este problema era an open bug, fijado en Doxygen 1.8.10.

1

Parece que este error se corrigió hace 3 semanas

Cuestiones relacionadas