小编Ale*_*nov的帖子

如何使用const键复制unordered_map?

简单的代码:

#include <unordered_map>

int main()
{
  std::unordered_map<const int, int> m;
  std::unordered_map<const int, int> m1 = m;
}
Run Code Online (Sandbox Code Playgroud)

产生复杂的编译错误消息:

错误C2280'std :: hash <_Kty> :: hash(void)':尝试引用已删除的函数

基本上unordered_map在内部表示不希望密钥保持不变

PS:我已经阅读了类似问题的答案

关联容器仅将(key,value)对公开为std :: pair,因此键类型上的其他const是多余的。

但这并没有解释为什么带有const键的哈希图实际上是不可用的,以及如何规避此问题

c++ stl

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

如何转换不同类型的迭代器

我有一个遗留函数Foo,它接受两个迭代器作为输入,我想重用它,但不应该更改它的接口(虽然我可以更改迭代器的类型,但不能使其成为模板)
问题是我有不同类型的迭代器并且必须复制初始容器以获取Foo函数所需的迭代器
我想知道是否有任何方法可以将一种类型的迭代器转换为另一种类型的迭代器?
我尝试使用,boost::make_transform_iterator但它不会编译,说迭代器属于不同类型
是否可以取消注释并使用option 2(参见下面的代码)?

#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>

#include <boost/iterator/transform_iterator.hpp>

/* Method with fixed interface */
void Foo(std::vector<int>::const_iterator beginIt, std::vector<int>::const_iterator endIt)
{
    std::cout << "ints:" << std::endl;
    std::copy(beginIt, endIt, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}

int main()
{
    const std::vector<std::string> strings { "2", "4", "6" };
    auto convertStringToInt = [](const std::string & s) { return std::stoi(s); };

    // 1) Works, but creates another …
Run Code Online (Sandbox Code Playgroud)

c++ boost iterator

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

如何为具有信号和槽的类强制使用 Q_OBJECT 宏

我有一堆定义了Q_OBJECT宏的基类和没有它的派生类:

class Base : public QObject
{
    Q_OBJECT
public:
    // signals and slots
};

class Derived : public Base
{
    // notice no `Q_OBJECT` macro
public:
    // signals and slots
};
Run Code Online (Sandbox Code Playgroud)

这工作正常,但根据Qt 文档

Q_OBJECT 宏必须出现在声明自己的信号和槽或使用 Qt 元对象系统提供的其他服务的类定义的私有部分中。

Q_OBJECT使用 Qt 元系统的类缺少宏时,有什么方法可以停止编译吗?

PS:我正在使用 MSVC 编译器

c++ qt visual-c++

5
推荐指数
0
解决办法
83
查看次数

如何对已剥离的共享库的堆栈跟踪进行符号化

我有来自Google Play服务的应用的崩溃报告,如下所示:

backtrace:
  #00  pc 00000000001b46a0  library.so
  #01  pc 0000000000604464  library.so
  #02  pc 0000000000c8ed1c  library.so
Run Code Online (Sandbox Code Playgroud)

我还有一个.map文件library.so,帮助我找到函数名称并将堆栈跟踪转换为更易读的格式:

backtrace:
  #00  pc 00000000001b46a0  library.so  foo()
  #01  pc 0000000000604464  library.so  bar()
  #02  pc 0000000000c8ed1c  library.so  zoo()
Run Code Online (Sandbox Code Playgroud)

但是手动解析函数名是容易出错的,它不会给我行号是导致崩溃的源代码.

我考虑过library.so在发布新版本时存储未剥离版本的想法,以便我可以使用ndk-stack工具,但剥离和未剥离二进制文件的AFAIK函数地址是不同的.

所以我的问题是可以继续发布剥离的二进制文件,并有办法自动用行号来表示堆栈跟踪吗?

任何建议将不胜感激

c++ linker android shared-libraries android-ndk

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

标签 统计

c++ ×4

android ×1

android-ndk ×1

boost ×1

iterator ×1

linker ×1

qt ×1

shared-libraries ×1

stl ×1

visual-c++ ×1