GCC:在输出中减少模板名称

在我的C ++代码中,我使用了很多模板..这可能是轻描淡写。 最终的结果是类型名称需要超过4096个字符,并且至少可以说看GCC输出是痛苦的。

在像GDB或Valgrind这样的几个调试软件包中,可以要求C ++类型不要被取消。 有没有类似的方法来强制G ++ 输出破损的类型名称,切割所有不必要的输出?

澄清

由于我给出的第一个答案,我发现问题并不清楚。 考虑下面的MWE:

template <typename T>
class A
{
    public:
        T foo;
};

template <typename T>
class B
{       
};

template <typename T>
class C
{
    public:
        void f(void)
        {
            this->foo = T(1);

            this->bar = T(2);
        }
};

typedef C< B< B< B< B< A<int> > > > > > myType;

int main(int argc, char** argv)
{
    myType err;

    err.f();

    return 0;
};

行中的错误this->bar = T(2); 仅当C<myType>类型的对象被实例化并调用C::f()方法时才会出错。 因此,G ++沿这些行返回错误消息:

test.cpp: In instantiation of ‘void C<T>::f() [with T = B<B<B<B<A<int> > > > >]’:
test.cpp:33:8:   required from here
test.cpp:21:14: error: no matching function for call to ‘B<B<B<B<A<int> > > > >::B(int)’
    this->foo = T(1);
              ^
test.cpp:21:14: note: candidates are:
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B()
 class B
       ^
test.cpp:11:7: note:   candidate expects 0 arguments, 1 provided
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B(const B<B<B<B<A<int> > > > >&)
test.cpp:11:7: note:   no known conversion for argument 1 from ‘int’ to ‘const B<B<B<B<A<int> > > > >&’
test.cpp:21:14: error: ‘class C<B<B<B<B<A<int> > > > > >’ has no member named ‘foo’
    this->foo = T(1);
              ^
test.cpp:23:14: error: no matching function for call to ‘B<B<B<B<A<int> > > > >::B(int)’
    this->bar = T(2);
              ^
test.cpp:23:14: note: candidates are:
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B()
 class B
       ^
test.cpp:11:7: note:   candidate expects 0 arguments, 1 provided
test.cpp:11:7: note: B<B<B<B<A<int> > > > >::B(const B<B<B<B<A<int> > > > >&)
test.cpp:11:7: note:   no known conversion for argument 1 from ‘int’ to ‘const B<B<B<B<A<int> > > > >&’
test.cpp:23:14: error: ‘class C<B<B<B<B<A<int> > > > > >’ has no member named ‘bar’
    this->bar = T(2);

类型名称在这里很刺激,但是当完整的类型名称需要数百个字符时才能读取。 有没有办法向海湾合作委员会索取类型名称而不是全名,或者以某种方式限制它们的长度?

STLFilt

不幸的是, STLFilt只会使输出更漂亮; 长度不会改变。 事实上,输出分成多行的事实使得整个事情变得更糟,因为输出需要更多的空间。


人们正受到C ++错误报告这一特殊缺陷的困扰。 :)

但是,对于复杂的问题解决,更详细的错误报告通常更好。 因此,更好的方法是让g ++吐出长而冗长的错误消息,然后使用独立的错误解析器使输出更具可读性。

在这里曾经有一个体面的错误解析器:http://www.bdsoft.com/tools/stlfilt.html(不幸的是,不再在开发中)。

另请参阅此近似重复:解密C ++模板错误消息


这将无法工作。 当你创建模板类时:

B<A<int> >

这个类在其定义中不再具有函数f()。 如果你用clang ++编译这个,你会得到这个错误(其中测试类型为B<A<int> > <A <int> B<A<int> > ):

error: no member named 'f' in 'B<A<int> >'
        test.f();
        ~~~~ ^

尝试使用铿锵++,如果你想稍微更可读的错误。


你可以使用typedef

typedef queue<int> IntQueue;

很显然,在这个例子中,你只删除了2个字符的类型名称,但更复杂的例子会缩小更多的字符,并且会提高代码的可读性。

此外,这可能有助于IDE的自动完成功能(如果使用的话)。

链接地址: http://www.djcxy.com/p/17537.html

上一篇: GCC: cutting down template names in output

下一篇: c++