Doxygen сообщает о потенциальной рекурсивной связи класса

У меня есть шаблонный класс С++ base::Foo<class T>, а в другом файле есть класс base::bar::Foo : public base::Foo<Baz>. Doxygen, похоже, это не нравится, так как выдает ошибку

<unknown>:1: Detected potential recursive class relation between class snLib::mocTwod::DsaCell and base class DsaCell< snLib::mocTwod::ProblemTraits, detLib::cellDiffusionTwod::ProblemTraits >!

Есть ли способ предотвратить это? В документации Doxygen не говорится об этой ошибке или о «потенциальных рекурсивных отношениях классов».

«Базовый» класс:

/*! \file snlib/DsaCell.hpp
 */
#ifndef snlib_DsaCell_hpp
#define snlib_DsaCell_hpp
#include "Dsa.hpp"

namespace snLib {
/*!
 * \brief  Implementation of naive cell-centered DSA
 */
template <class HoTraits_T, class LoTraits_T>
class DsaCell : public snLib::Dsa< HoTraits_T, LoTraits_T >
{
    [snip]
};
}
#endif

один из его потомков, который вызывает проблему:

/*! \file snlib/twod/moc/DsaCell.hpp
 */
#ifndef snlib_twod_moc_DsaCell_hpp
#define snlib_twod_moc_DsaCell_hpp
#include "snlib/DsaCell.hpp"

#include "ProblemTraits.hpp"
#include "detlib/twod/celldiffusion/ProblemTraits.hpp"

namespace snLib { namespace mocTwod {
/*!
 * \brief Inconsistent DSA for MOC
 */
class DsaCell : public snLib::DsaCell<
                        snLib::mocTwod::ProblemTraits,
                        detLib::cellDiffusionTwod::ProblemTraits
                        >
{
    [snip]
};
} } // end namespace snLib::mocTwod
#endif

В моем конфигурационном файле Doxygen установлено много параметров, включая конфигурацию пути: STRIP_FROM_PATH (установлен в корневой каталог), STRIP_FROM_INC_PATH (то же самое), INCLUDE_PATH (то же самое).

Редактировать: похоже, что ошибка была фактически выдана в другом Doxyfile, который использовал теги XML, сгенерированные файлом с конфликтующим именем, поэтому проблема была связана с этим. Во всяком случае, я просто переименовал базовый класс во что-то другое, и все снова было хорошо.


person Seth Johnson    schedule 02.03.2011    source источник
comment
Сообщите об ошибке, но действительно вложенные имена могут конфликтовать, чтобы обеспечить асинхронную разработку разными командами. Преднамеренное повторное использование одного и того же имени по-прежнему не рекомендуется, даже если язык позволяет это.   -  person Ben Voigt    schedule 02.03.2011
comment
Вы должны опубликовать свой точный код, а не его синтезированную версию. Вы полностью соответствуете базовому классу?   -  person David Rodríguez - dribeas    schedule 02.03.2011
comment
@Бен: Спасибо за предложение; Я мог бы просто переименовать базовый класс.   -  person Seth Johnson    schedule 02.03.2011
comment
@David: я подумал, что сначала опубликую общее описание на случай, если это известная проблема, потому что люди обычно отказываются от больших кусков кода. : P Я обновлю свой ответ, но сомневаюсь, что он будет очень полезен.   -  person Seth Johnson    schedule 02.03.2011
comment
@Seth Johnson: Какую версию doxygen ты используешь?   -  person Alok Save    schedule 06.04.2011
comment
@Als: я использую Doxygen 1.7.2.   -  person Seth Johnson    schedule 06.04.2011
comment
Это правда, что вложенные имена могут конфликтовать, но я согласен с вами, что вам, вероятно, следует переименовать базовый класс. Мое личное эмпирическое правило заключается в том, что конфликты имен, разрешенные языком, приемлемы, если два класса на самом деле не взаимодействуют, но если они взаимодействуют, это может стать источником некоторой путаницы (как для разработчиков, так и, по-видимому, для программного обеспечения для синтаксического анализа). .   -  person Reinderien    schedule 10.04.2011
comment
@SethJohnson Пожалуйста, не обращайте внимания на любые советы, чтобы все имена классов были уникальными. Смысл пространств имен не в том, чтобы приспосабливаться к конфликтам, а в том, чтобы их избегать. Рассмотрим, например, имена классов в пространстве имен boost, которые совпадают с std. OTOH, убедитесь, что ваши имена классов точны, например. соблюдая правило «является» для классов: убедитесь, что snLib::mocTwod::DsaCell является snLib::DsaCell.   -  person John McFarlane    schedule 07.07.2019


Ответы (1)


В Doxygen есть функция, которая проверяет, имеют ли классы A и B отношение наследования (прямое или косвенное), которое является рекурсивным. Функция проверяет рекурсию на предел глубины 256.

Вероятно, doxygen путают с вашим кодом (поскольку название совпадает) и думают, что класс A зависит от B, а B снова зависит от A.

Это может быть ошибка Doxygen, но лучшим подходом может быть переименование класса.

person robermorales    schedule 21.09.2011
comment
Ограничение выбора имен классов из-за некачественного инструментария мне кажется плохой идеей. - person John McFarlane; 07.07.2019
comment
@JohnMcFarlane вы провели какое-то исследование и проверили проблему с текущей версией doxygen? Удалось ли вам воспроизвести старое (doxygen 1.7.2) поведение? Пожалуйста, покажите код, который вы использовали для воспроизведения проблемы. - person albert; 07.07.2019
comment
@albert Воспроизведение ошибки с 1.8.11. Ветка, используемая для воспроизведения. Подтверждено с версией 1.8.13. - person John McFarlane; 08.07.2019
comment
Я только что пробовал с версиями 1.8.11, 1.8.13 и основной версией, взяв репозиторий (ветвь разработки) как данный и взял чистый Doxyfile (только установив для RECURSIVE значение YES и перехватив предупреждения в файле). и получил для обеих версий 3 рекурсивных предупреждения, но не то, что указано в Воспроизведении сбоя с 1.8.11. В файле include/cnl/_impl/integer/numeric_limits.h в моем случае всего 31 строка, нужна ли специальная ветка? - person albert; 08.07.2019
comment
Первое рекурсивное предупреждение, которое я получаю: include/cnl/rounding_integer.h:270: warning: Detected potential recursive class relation between class std::numeric_limits< cnl::rounding_integer< Rep, RoundingTag > > and base class numeric_limits< cnl::rounding_integer< Rep, RoundingTag > >! - person albert; 08.07.2019
comment
Только что попробовал ветку so7498072, и здесь я получаю сообщение, как сообщалось. Лучше всего создать задачу на github.com/doxygen/doxygen/issues/new. с прикрепленным небольшим автономным примером (исходный файл + файл конфигурации в tar или zip), который позволяет нам воспроизвести проблему? Пожалуйста, не добавляйте внешние ссылки, так как они могут быть непостоянными. - person albert; 08.07.2019
comment
@albert Я дал вам пример, который вы смогли воспроизвести, и вы все еще хотите, чтобы я потратил время, чтобы уменьшить пример и отправить его в проект с открытыми проблемами 1999 года? Спасибо, но я бы предпочел потратить это время на переход к лучшему генератору документации. - person John McFarlane; 25.07.2019
comment
@JohnMcFarlane Вопрос здесь, на stackexchange, не регистрируется в системе отслеживания ошибок и, как таковой, не попадет / не останется у разработчиков doxygen. Поиск в большой программе того места, где действительно возникает проблема, является утомительной и очень трудоемкой работой, и ее можно значительно сократить, если заявитель сводит проблему к, возможно, минимальному примеру. - person albert; 25.07.2019
comment
@JohnMcFarlane Как вы упомянули количество открытых проблем, около 220 были рассмотрены и решены / решены в то же время (и некоторые из них имеют запрос на вытягивание и не находятся в решенном состоянии, пока они не будут интегрированы в основную ветку. Тем не менее, есть довольно много открытых проблем, но вы также видели, что есть довольно много запросов на включение с возможными решениями, и с момента последнего выпуска довольно много запросов на включение было интегрировано в мастер, Так что да, пожалуйста, создайте минимальный пример. - person albert; 25.07.2019