小编Dre*_*mer的帖子

GDB相当打印ImportError:没有名为'printers'的模块

我正在尝试在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模块丢失了?这对我来说真的很奇怪.

c++ python gdb stl pretty-print

7
推荐指数
1
解决办法
7565
查看次数

C++ 将右值引用传递给采用左值引用的函数

当我阅读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 &&

如果一个采用左值引用类型参数的函数可以通过右值引用传递,那么这个函数可以做任何它想做的事情,甚至修改传入的右值(就像一个临时对象)。这对我来说没有意义...

function rvalue-reference c++11

6
推荐指数
1
解决办法
8445
查看次数

C++错误:无法调用'(std :: string {aka std :: basic_string <char>})(std :: string&)'

我是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++ string constructor compiler-errors initialization

5
推荐指数
1
解决办法
3万
查看次数

C++如果跟着一个for循环块

我记得有一次我看到有人写这样的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++ if-statement

0
推荐指数
1
解决办法
177
查看次数