我正在尝试在Ubuntu 14.04上为我的GDB 添加漂亮的STL 打印.有关工具的一些细节:
操作系统:Ubuntu 14.04
gdb版本:7.7
python版本:2.7.6
python3版本:3.4.0
但在我完全按照指令所说的设置之后.我仍然会收到以下错误:
Traceback (most recent call last):
File "<string>", line 3, in <module>
File "/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/__init__.py", line 19, in <module>
from printers import register_libstdcxx_printers
ImportError: No module named 'printers'
/home/jerry/.gdbinit:6: Error in sourced command file:
Error while executing Python code.
Reading symbols from main...done.
Run Code Online (Sandbox Code Playgroud)
然后我又仔细检查了我漂亮的打印安装目录.在目录下/home/jerry/myLib/gdb_stl_support/python/libstdcxx/v6/,我可以清楚地看到我有printers.py文件.而且我也查看了printers.py的内容,我确信它也有register_libstdcxx_printers类.为什么python解释器还在抱怨printers模块丢失了?这对我来说真的很奇怪.
当我阅读Scott Meyer 撰写的《Effective Modern C++》,了解 std::forward 函数如何工作时,我遇到了一个我不太明白的问题。假设我们有一个foo如下函数:
template<typename T>
void foo(T&& fooParam)
{
...
someFunc(std::forward<T>(fooParam));
}
Run Code Online (Sandbox Code Playgroud)
在书中,斯科特解释说std::forward<T>可以通过以下方式实现:
template<typename T>
T&& forward(typename remove_reference<T>::type& param)
{
return static_cast<T&&>(param);
}
Run Code Online (Sandbox Code Playgroud)
假设传递给的参数foo是类型的右值Widget。然后std::forward函数模板将像这样初始化:
Widget&& forward(Widget& param)
{ return static_cast<Widget&&>(param); }
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,当fooParam(类型为Widget &&)传递给 时,采用matchstd::forward类型参数的函数如何?我知道它本身是一个左值。但它的类型仍然是右值引用 ( ) 对吗?他们怎么可能相配呢?Widget& paramfooParamfooParamWidget &&
如果一个采用左值引用类型参数的函数可以通过右值引用传递,那么这个函数可以做任何它想做的事情,甚至修改传入的右值(就像一个临时对象)。这对我来说没有意义...
我是C++的新手.我搜索了很多次,但仍然无法得到答案.我正在写一个名为Course的课程来描述学生在学校学习的课程.Course类有3个文件:
protected:
string courseName;
int courseNum;
float score;
Run Code Online (Sandbox Code Playgroud)
我有一个公共方法"setName"来设置课程名称:
Course &setName(string name)
{
this->courseName(name);
return (*this);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译时,编译器抱怨: C++错误:无法调用'(std :: string {aka std :: basic_string})(std :: string&)' 我也尝试将代码修改为Course&setName(string&name)...编译器一直抱怨同样的错误.
但是,如果我将代码更改为:
Course &setName(string name)
{
this->courseName = name;
return (*this);
}
Run Code Online (Sandbox Code Playgroud)
然后它运作良好.我无法理解编译器在抱怨什么以及为什么我不能使用直接初始化?
我记得有一次我看到有人写这样的C++代码:
if (something is true)
for (int i = 0; i < max; i++) {
//do something
line 1;
line 2;
line 3;
....
....
}
else
....
Run Code Online (Sandbox Code Playgroud)
它的工作原理与以下代码相同:
if (something is true) { //note the bracket here
for (int i = 0; i < max; i++) {
//do something
line 1;
line 2;
line 3;
....
....
}
}
else
....
Run Code Online (Sandbox Code Playgroud)
我想知道编译器是否将for循环块视为嵌套在if子句中的一行?括号内的多行代码是否总是被视为一行?我不太明白编译器如何解析和分析它.
c++ ×3
c++11 ×1
constructor ×1
function ×1
gdb ×1
if-statement ×1
pretty-print ×1
python ×1
stl ×1
string ×1