Doxygen 1.8.11对以下定义感到窒息,我尽可能地简化了这个定义而不会丢失警告信息:
template <class T>
struct MySpecialization<T, void_t<decltype(std::declval<T>().foo(
std::declval<double>()))>> : std::true_type {};
警告是:
warning: Found ';' while parsing initializer list! (doxygen could be confused by a macro call without semicolon)
有趣的是,Doxygen可以满足以下要求:
template <class T>
struct MySpecialization<T, void_t<decltype(std::declval<T>().foo())>> : std::true_type {};
基本上是相同的定义而没有foo
的参数。
我非常感谢一种解决方法。在最坏的情况下,我想以某种方式导致Doxygen忽略这个定义。
答案 0 :(得分:2)
答案在docs。使用doxygen的\cond
和\endcond
命令或使用预处理器定义。
/// \cond NOPE
template <class T>
struct MySpecialization<T, void_t<decltype(std::declval<T>().foo(
std::declval<double>()))>> : std::true_type {};
/// \endcond
使用预处理器定义,您可以添加Doxygen友好的定义。例如,Qt项目就是这样做的。
#ifdef DOXYGEN_WORKING
template <class T>
struct MySpecialization<T, something_that_doxygen_understands> : std::true_type {};
#else
template <class T>
struct MySpecialization<T, void_t<decltype(std::declval<T>().foo(
std::declval<double>()))>> : std::true_type {};
#endif
并将PREDEFINED = DOXYGEN_WORKING
添加到配置文件中。
答案 1 :(得分:2)
我刚刚在GitHub中针对此问题提供了修复,请参阅https://github.com/doxygen/doxygen/commit/985faf287233badf65fa33d21bde17afa6970d60