Когда я пишу шаблоны классов и должен полностью - специализируют членов тех классов, 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';
Так же в этом случае нечто () будет зарегистрировано как печать "Универсального нечто", INT_CONST будет зарегистрирован, как установлено на 5 без упоминания о специализациях, и TTYPE_CONST будет зарегистрирован, как установлено на без упоминания о 3,141 и никакой признак что специализированного случая.
Я должен смочь зарегистрировать специализации - любой в рамках документации для 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
Дальнейший поиск показывает, что эта проблема была открытой ошибкой , исправленной в Doxygen 1.8.10.