有没有办法避免警告/错误模板实例化回溯?

Posted

技术标签:

【中文标题】有没有办法避免警告/错误模板实例化回溯?【英文标题】:Is there anyway to avoid warning/error template instantiation backtrace? 【发布时间】:2015-03-02 17:42:44 【问题描述】:

花了一些时间,但完全不知道它是否可能。因此我想我会在这里问。那么,在 gcc/clang 上显示警告/错误时,是否有任何巧妙的方法强制不打印模板回溯?

例子:

template<int I = 0, typename = void>
struct warn 
    unsigned : I;
;
struct hello_world ;

template<int I>
class a : warn<I, hello_world> ;

template<int I>
class b : a<I>;

template<int I>
class c : b<I> ;

template<int I>
class d : c<I> ;

int main() 
    d<80>;

给予:

test.cpp:3:5: warning: size of anonymous bit-field (80 bits) exceeds size of its type; value will be truncated to 32 bits
    unsigned : I;
    ^
test.cpp:8:11: note: in instantiation of template class 'warn<80, hello_world>' requested here
class a : warn<I, hello_world> ;
          ^
test.cpp:11:11: note: in instantiation of template class 'a<80>' requested here
class b : a<I>;
          ^
test.cpp:14:11: note: in instantiation of template class 'b<80>' requested here
class c : b<I> ;
          ^
test.cpp:17:11: note: in instantiation of template class 'c<80>' requested here
class d : c<I> ;
          ^
test.cpp:20:2: note: in instantiation of template class 'd<80>' requested here
        d<80>;
        ^
1 warning generated.

因此,预期的结果将是例如:

test.cpp:3:5: warning: size of anonymous bit-field (80 bits) exceeds size of its type; value will be truncated to 32 bits
    unsigned : I;
    ^
test.cpp:8:11: note: in instantiation of template class 'warn<80, hello_world>' requested here
class a : warn<I, hello_world> ;

有-ftemplate-backtrace-limit=1 -ferror-limit=1,但我想知道是否有可能从源代码中做到这一点。

为什么我需要这样的功能?好吧,我通过 enable-if 使用概念模拟,但不幸的是,我的概念构造中有模板转换运算符,不能只返回值和静态断言或 enable-if,因为信息不再可用。因此,我认为警告+概念可能会起作用。假设我仍然有这个概念并用有用的东西打印一行警告,然后像往常一样使用 enable-if 禁用该功能。

【问题讨论】:

【参考方案1】:

您可以使用别名而不是类/结构来接近:

template<int I = 0, typename = void>
struct warn 
    unsigned : I;
;
struct hello_world ;

template<int I>
using a = warn<I, hello_world>;

template<int I>
using b = a<I>;

template<int I>
using c = b<I>;

template<int I>
using d = c<I>;

int main() 
  (void)d<80>;

输出:

test.cpp:3:5: warning: size of anonymous bit-field (80 bits) exceeds size of its type; value will be truncated to 32 bits
    unsigned : I;
    ^
test.cpp:20:9: note: in instantiation of template class 'warn<80, hello_world>' requested here
  (void)d<80>;
        ^
1 warning generated.

【讨论】:

以上是关于有没有办法避免警告/错误模板实例化回溯?的主要内容,如果未能解决你的问题,请参考以下文章

无法强制实例化专用模板

什么时候实例化类模板?

实例化模板类时出现链接器错误

有没有办法在头文件中声明指针并在 .cpp 中实例化它?

如何对复杂的模板化函数进行显式实例化?和相关的 Intellisense 错误

带有非类型参数的奇怪模板实例化错误