在C++ Primer Plus(2001,捷克语翻译)中,我发现了这些不同的模板特化语法:
功能模板
template <typename T> void foo(T);
Run Code Online (Sandbox Code Playgroud)
专业化语法
void foo(int param); // 1
void foo<int>(int param); // 2
template <> void foo<int>(int param); // 3
template <> void foo(int param); // 4
template void foo(int param); // 5
Run Code Online (Sandbox Code Playgroud)
谷歌搜索了一下,我发现只有3号例子.它们之间是否存在差异(通话,编译,使用)?其中一些是否已过时/弃用?为什么不使用No.1?
std::unique_ptr很好,但我发现在DDD或gdb中调试时不太舒服.
我正在使用作为gcc一部分的gdb漂亮打印机(例如/usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py).这是可读性的一大胜利,例如:
$ print pTest
std::unique_ptr<MyType> containing 0x2cef0a0
Run Code Online (Sandbox Code Playgroud)
但是,取消引用指针不起作用:
$ print *pTest
Could not find operator*.
Run Code Online (Sandbox Code Playgroud)
当我需要访问该值时,我必须手动复制指针并将其强制转换为正确的类型,例如:
print *((MyType*) 0x2cef0a0)
Run Code Online (Sandbox Code Playgroud)
如果进程仍在运行,那么这个版本可以工作(仍然很难但更好):
print *pTest.get() // will not work if analyzing a core dump
Run Code Online (Sandbox Code Playgroud)
Display *pTest在DDD中直接的方法也不起作用.它只会导致以下错误:
<error: Could not find operator*.>
Run Code Online (Sandbox Code Playgroud)
有没有办法在DDD中使用unique_ptr调试C++ 11代码(不像我使用繁琐的解决方法那样打破工作流程)?
我不怕使用gdb命令,但DDD集成将是一个加号.例如,通过双击它们来跟踪数据结构中的指针通常比键入更快.
我已经尝试放弃漂亮的打印机,但它也不是最佳选择.我能想到的最好的是以下内容:
print pTest._M_t->_M_head_impl
Run Code Online (Sandbox Code Playgroud) 我gdb 7.7在OS X Mavericks(10.9.2)下安装了(来自GNU源代码).我对它进行了编码,因此每当我调试c++不包含模板的文件时它都能正常工作.但是,它无法进入模板函数(可以进入常规函数,但只是无法进入模板函数).当我step在调试会话中键入命令时,它只是跳过该函数,就好像模板函数没有调试符号一样.我的模板函数甚至不是成员函数,只是里面定义的一个简单函数main.cpp.
我编译我的程序用g++ -g -O0 main.cpp(我用g++4.8.2的macports,而不是clang++),甚至试图-fno-inline,还是同样的行为,无法步入模板函数.这是gdbOS X Mavericks下的已知问题吗?或者,任何人都可以重现这个错误吗?
我的代码:
#include <iostream>
template <typename T> // template
void f(T x)
{
std::cout << "In f:" << std::endl;
std::cout << x << std::endl;
}
void g() // non-template
{
std::cout << "It works here!" << std::endl;
std::cout << "Exiting g()..." << std::endl;
}
int main()
{
f<double>(12.3); // gdb does …Run Code Online (Sandbox Code Playgroud)