在我的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);
这里的类型名称很烦人,但是当完整的类型名称需要数百个字符时,无法读取。有没有办法向GCC询问损坏的类型名称而不是全名,或以某种方式限制其长度?
不幸的是,STLFilt
只会使输出更漂亮;长度不会改变。事实上,输出被分成多行的事实使整个事情变得更糟,因为输出占用更多空间。
答案 0 :(得分:2)
人们正在遭受C ++错误报告的特殊缺点。 :)
但是,更复杂的错误报告通常更适合复杂的问题解决。因此,更好的方法是让g ++吐出冗长而冗长的错误消息,然后使用独立的错误解析器使输出更具可读性。
这里曾经有一个像样的错误解析器:http://www.bdsoft.com/tools/stlfilt.html(不幸的是,不再在开发中)。
答案 1 :(得分:1)
这永远不会奏效。制作模板类时:
B<A<int> >
这个类在其定义中不再具有函数f()。如果用clang ++编译它,你会得到错误(测试的类型为B<A<int> >
):
error: no member named 'f' in 'B<A<int> >'
test.f();
~~~~ ^
如果您想要稍微更易读的错误,请尝试使用clang ++。
答案 2 :(得分:0)
您可以使用typedef
:
typedef queue<int> IntQueue;
显然,在这个示例中,您只删除了2个字符类型名称,但是使用更复杂的示例,这将缩小更多字符,并提高代码的可读性。
此外,这可能有助于IDE的自动完成功能(如果使用的话)。