小编piw*_*iwi的帖子

通过重复对象名称调用静态方法?

我有一个单身人士:

struct foo {
  static foo& instance() {
    static foo f;
    return f;
  }
};
Run Code Online (Sandbox Code Playgroud)

在重新安排一些代码时,我最终得到了"错误"这句话:

foo::foo::instance()
Run Code Online (Sandbox Code Playgroud)

但是我的编译器认为这是正确的(gcc 4.7).事实上,甚至foo::foo::foo::instance()编译.为什么?

c++ c++11

46
推荐指数
3
解决办法
2107
查看次数

在gcc中,如何将-fpermissive警告静音?

我包含来自第三方库的文件,该文件引发了一个错误,可以将其降级为警告-fpermissive.但是因为我不想用这些警告"污染"我的编译日志,所以我想完全禁用这些消息.

到目前为止,我在包含文件时-fpermissive使用诊断编译指示设置选项; 就像是:

#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-fpermissive"

#include <third-party-file.h>

#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

由于gcc通常提供-f标志的"正面"和"负面"版本,我想忽略了"不允许"的功能:

#pragma GCC diagnostic ignored "-fno-permissive"
#include <third-party-file.h>
Run Code Online (Sandbox Code Playgroud)

但似乎没有-fpermissive标志的"负面"版本(我正在使用gcc 4.6.3;但即使版本4.7.0 也没有它).

我有机会模仿这种行为吗?谢谢!

c++ gcc warnings pragma

22
推荐指数
2
解决办法
4万
查看次数

如何组合std :: bind(),可变参数模板和完美转发?

我想通过第三方函数调用另一个方法; 但两者都使用可变参数模板.例如:

void third_party(int n, std::function<void(int)> f)
{
  f(n);
}

struct foo
{
  template <typename... Args>
  void invoke(int n, Args&&... args)
  {
    auto bound = std::bind(&foo::invoke_impl<Args...>, this,
                           std::placeholders::_1, std::forward<Args>(args)...);

    third_party(n, bound);
  }

  template <typename... Args>
  void invoke_impl(int, Args&&...)
  {
  }
};

foo f;
f.invoke(1, 2);
Run Code Online (Sandbox Code Playgroud)

问题是,我收到编译错误:

/usr/include/c++/4.7/functional:1206:35: error: cannot bind ‘int’ lvalue to ‘int&&’
Run Code Online (Sandbox Code Playgroud)

我尝试使用lambda,但也许 GCC 4.8还没有处理语法; 这是我试过的:

auto bound = [this, &args...] (int k) { invoke_impl(k, std::foward<Args>(args)...); };
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: expected ‘,’ before ‘...’ token
error: expected identifier …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-templates perfect-forwarding c++11

10
推荐指数
1
解决办法
6719
查看次数

数据更改时自动刷新QTableView

我编写了一个自定义数据模型,用几个QTableViews显示.

从技术上讲,一切正常:我的观点显示了我的模型所做的更改.我的数据模型是可编辑的,并且该setData()方法确实发出dataChanged()信号并true在成功编辑时返回.

但是,我的问题是我必须将鼠标移到a QTableView上以显示实际的更改,而我希望所有视图在制作时显示更改,而不需要与视图交互以使它们成为更新.

任何的想法?谢谢,


可能有必要提一下,我不使用默认Qt::EditRole角色来编辑数据,而是使用自定义枚举值(命名ActiveRole).

这是我正在寻找的:我的数据模型包含有关如何显示数据的属性,用于生成馈送到viewS的样式表.

因此,当改变模型时,对于每个视图,其所有项都受到影响,这dataChanged()就是发送信号的原因,其中索引覆盖所有单元.

我也尝试发射layoutChanged(),但它似乎没有改变我的情况下的行为.

以下是该setData()方法的摘录:

bool DataModel::setData(QModelIndex const& idx, QVariant const& value, int role)
{
  if (ActiveRole == role)
  {
    // Update data...

    QModelIndex topLeft = index(0, 0);
    QModelIndex bottomRight = index(rowCount() - 1, columnCount() - 1);

    emit dataChanged(topLeft, bottomRight);
    emit layoutChanged();

    return true;
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

以下是该data()方法的示例:

QVariant DataModel::data(QModelIndex const& idx, int role) const …
Run Code Online (Sandbox Code Playgroud)

c++ model-view-controller qt

7
推荐指数
2
解决办法
3万
查看次数

Emacs,GDB和多个X窗口

我用gdb-many-windowsemacs进行调试.

最近,我发现了如何缓冲区中移动到另一个X窗口使用C-x 5 2.

我觉得很方便:因为我使用多个显示器,我可以有一个带有源和变量的窗口,以及另一个窗口中的gdb命令行.

但我的问题是当我执行一步一步时gdb:当它打开另一个源文件时,它会在命令行所在的同一窗口中执行此操作,而我希望在另一个窗口中更新它.

有人知道如何调整gdbemacs做到这一点?谢谢,

emacs gdb

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

如何实现菱形继承的移动构造函数?

我有一个菱形的类层次结构,其中没有默认构造函数,也没有复制构造函数.我有两个构造函数是一个"移动",另一个是对对象的左值引用:

struct base {
    base(base&&) = default;
    base(member_type&& m): member_(std::move(m)) {}
    member_type member_;
};

struct virt_1: virtual base {
    virt_1(virt_1&& rhs): base(std::move(rhs)) {}
    virt_1(member_type&& m): base(std::move(m)) {}
};

struct virt_2: virtual base {
    virt_2(virt_2&& rhs): base(std::move(rhs)) {}
    virt_2(member_type&& m): base(std::move(m)) {}
};

struct concrete: virt_1, virt_2 {
    concrete(concrete&& rhs) // ???
};
Run Code Online (Sandbox Code Playgroud)

除了不使用菱形层次结构外,是否可以为具体类实现移动构造函数?

谢谢!

c++ inheritance c++11

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

从 CMake / PkgConfig 向 pkg-config 提供选项 --define-variable

为了在 Windows 上移植 Linux 程序(使用 cygwin 和 gcc),我试图正确找到提供pkg-config文件的库(在我的情况下,这些库是由 Graphviz 带来的)。

直接的方法适用于 Linux:

find_package(PkgConfig)
pkg_check_modules(LIB_GRAPHVIZ libcdt libgvc libgraph)
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,我使用安装程序(cygwin 路径:)手动安装了 Graphviz /cygdrive/c/graphviz。为了找到这些pkg-config文件,我导出了PKG_CONFIG_PATH变量,以便.pc在配置 CMake 之前找到这些文件:

export PKG_CONFIG_PATH=/cygdrive/c/graphviz/pkgconfig
cmake $srcdir
Run Code Online (Sandbox Code Playgroud)

配置工作正常,但是.pc文件没有适当的前缀(这会导致包含和链接目录无效):

$ pkg-config --variable=prefix libgraph
/c/graphviz-mingw/local.2.20.3
Run Code Online (Sandbox Code Playgroud)

关于pkg-config,解决方案是使用--define-variable参数调用它,例如这里是如何获得有效的includedir

$ pkg-config --define-variable=prefix=/cygdrive/c/graphviz --variable=includedir libgraph
/cygdrive/c/graphviz/include/graphviz
Run Code Online (Sandbox Code Playgroud)

我的问题:如何在 CMake 中调用它时提供--define-variable参数pkg-config

PkgConfig定义PKG_CONFIG_EXECUTABLE指向pkg-config程序的那个;我试图将我的选项附加到这个变量:

set(PKG_CONFIG_EXECUTABLE "${PKG_CONFIG_EXECUTABLE} --define-variable=/cygdrive/c/graphviz")
Run Code Online (Sandbox Code Playgroud)

pkg_check_modules()未能检测到我的库。我的理解是调用将execute_process()的内容 …

windows cygwin build-process pkg-config cmake

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

如何从Android Studio调试Windows上的外部本机库?

我正在尝试调试(从Windows)Android应用程序内部提供的本机库(使用NDK v13b构建).该库是在Android Studio之外构建的,它不使用Gradle(使用CMake).

我的库是用调试构建的; Studio中的调试配置是Hybrid,我给出了相应的符号目录.要"导入"我的库,我只需将项目目录中的文件.so.jar文件复制到适当的位置(libs对于JAR,jniLibs对于SO).

当库建立在单独的机器(Linux)上时,只要我重新映射源位置(即使用settings set target.source-map),我就可以一步一步地完成任务.

但是,当我在Windows系统上构建库时,逐步不再起作用.

我注意到行为的不同取决于我使用"内置Linux"或"内置Windows"库进行调试.使用from-Linux进行调试时,LLDB命令image list指示库路径位于初始构建目录中.但是,在从Windows调试时,它就在C:\Users\foo\.lldb\module_cache\remote-android\.cache....这个版本的库似乎被删除了.

为什么这种行为的差异?我怎样才能1.在模块缓存中使用我的库的原始副本,或2.直接使用构建库?

谢谢,

c++ debugging android android-studio

6
推荐指数
0
解决办法
611
查看次数

在 CMake 中,是否可以构建从构建树导入的依赖项?

我正在尝试使用 CMake 功能从构建树导出/导入目标(请参阅此 wiki 页面)。我有这个dependency图书馆:

add_library(dependency SHARED dependency.cpp)
export(TARGETS dependency FILE dependency-targets.cmake)
Run Code Online (Sandbox Code Playgroud)

一个可执行文件在另一个项目中使用这个库:

include(${DEPENDENCY_PATH}/dependency-targets.cmake)

add_executable(main-app main.cpp)
target_link_libraries(main-app dependency)
Run Code Online (Sandbox Code Playgroud)

这工作正常。虽然我明白,“只有”这个导出/导入机制提供参考外部二进制文件的便捷方式,我想知道是否dependency可以在运行时编译makemain-app?使用导入机制(我怀疑)还是使用另一个?

build-automation build-process cmake

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

如何避免剥离仅用于调试构建类型的AAR中打包的本机库?

我有一个为Android构建的C ++库,将其打包为Android归档文件(.aar),以及一些Java类和清单。

一切都在Android Studio之外完成。要打包.aar,我有一个目录,其中包含:

  • app/src/main/jniLibs/arm64-v8a/:带库的目录
  • app/src/main/java:带有Java类的目录

该目录还包含清单和Gradle文件。

这里是build.gradleapp目录:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 27
    buildToolsVersion "27.0.2"

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 27
    }
    buildTypes {
        release {
            minifyEnabled false
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:appcompat-v7:27.0.2'
}

apply plugin: 'maven-publish'

publishing {
    publications {
        fooapp(MavenPublication) {
            groupId 'com.example'
            artifactId 'fooapp'
            version "develop"
            artifact('build/outputs/aar/app-release.aar')
        }
    }
    repositories {
        maven {
            mavenLocal()
        }
    } …
Run Code Online (Sandbox Code Playgroud)

android gradle android-ndk

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