我计划模板化一个可用于各种数据类型的容器类。我目前有一个很大的担忧:
我不是在谈论调试模板实例化本身,我也不是在谈论广泛的元编程。
我在互联网上做了一些研究,但搜索结果已经完成了真实的模板调试,很难找到这个(希望)相对简单的问题的答案。
答案 0 :(得分:3)
您可以使用gdb rbreak
命令在模板的所有实例上使用gdb中断!这使用了很多!更容易。
#include <iostream>
#include <string>
template < typename T>
T Foo(T t) { return t; }
int main()
{
std::cout << Foo<int>(1) << std::endl;
std::cout << Foo<std::string>("Hallo") << std::endl;
}
您可以按如下方式使用gdb:
gdb> rbreak Foo<.*>
Breakpoint 4 at 0x400cc5: file main.cpp, line 5.
int Foo<int>(int);
Breakpoint 5 at 0x400cda: file main.cpp, line 5.
std::basic_string<char, std::char_traits<char>, std::allocator<char> > Foo<std::string>(std::string);
希望这有帮助!
答案 1 :(得分:2)
普通班级
class foo
{
private:
int x;
public:
foo(int n = 0):x(n) {cout<<"foo::foo(int)"<<endl;}
~foo() {cout<<"foo::~foo()"<<endl;}
};
To put the breakpoint, we follow as below
$gdb: b foo::foo(int)
b foo::~foo()
=============================================== ==========
模板类示例
template<typename T>
class bar
{
private:
T x;
public:
bar(T n = 0):x(n) {cout<<"bar::bar(int)"<<endl;}
~bar() {cout<<"bar::~bar()"<<endl;}
};
To put the breakpoint, we follow as below
$gdb: b bar<int>::bar(int)
b foo<int>::~bar()
我们唯一需要理解的是(我猜你们有点困惑),当我们调试模板类时,我们不能像bar<T>::bar()
这样使用断点。程序运行时,程序会将模板类实例化为特定类型bar<int>::bar()
。
除此之外,调试非模板与基于模板的类没有区别。我们唯一需要考虑的是,模板基类会有点冗长,特别需要一些时间才能理解。