2010-03-24 47 views
15

Khi tôi viết mẫu lớp và cần phải chuyên môn hóa đầy đủ các thành viên của lớp đó, Doxygen không nhận ra chuyên môn - nó chỉ ghi định nghĩa chung hoặc (nếu chỉ có chuyên môn) định nghĩa cuối cùng. Dưới đây là một ví dụ đơn giản:Doxygen cho C++ mẫu chuyên môn thành viên lớp mẫu

=== 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'; 

Vì vậy, trong trường hợp này, foo() sẽ được viết thành "Chung foo", INT_CONST sẽ được ghi thành 5, không đề cập đến chuyên môn, và TTYPE_CONST sẽ được ghi thành 'a', không đề cập đến 3.141 và không có dấu hiệu cho thấy 'a' là một trường hợp đặc biệt.

Tôi cần có thể ghi lại các chuyên môn - trong tài liệu cho MyClass<T> hoặc trên các trang mới cho MyClass<double>, MyClass<char>. Làm thế nào để tôi làm điều này? Doxygen có thể xử lý điều này không? Tôi có thể làm điều gì đó sai trái trong cấu trúc khai báo/mã khiến cho Doxygen không hiểu tôi muốn gì không?

tôi nên lưu ý hai trường hợp liên quan:

A) Đối với chức năng templated, chuyên môn hóa hoạt động tốt, ví dụ .:

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

này sẽ ghi lại cả foo<T>()foo<double>().

B) Nếu tôi redeclare toàn bộ mẫu, tức là template<> class MyClass<double>{...};, thì MyClass<double> sẽ nhận được trang tài liệu riêng của mình, dưới dạng một lớp riêng biệt. Nhưng điều này có nghĩa là thực sự khai báo một lớp hoàn toàn mới - không có mối quan hệ nào giữa số MyClass<T>MyClass<double> nếu chính nó được khai báo là MyClass<double>. Vì vậy, tôi phải redeclare lớp và tất cả các thành viên của nó, lặp lại tất cả các định nghĩa của các thành viên lớp, chuyên cho MyClass<double>, tất cả để làm cho nó xuất hiện như thể họ đang sử dụng cùng một mẫu. Rất khó xử, cảm thấy như một giải pháp kludge.

Đề xuất? Cảm ơn nhiều :)

--Ziv

Trả lời

13

tìm kiếm sâu hơn cho thấy vấn đề này là an open bug, cố định trong Doxygen 1.8.10.

1

Lỗi này dường như được khắc phục 3 tuần trước

Các vấn đề liên quan