小编Chr*_*odd的帖子

在C++中使用不同的分配器复制对象

所以我有一个很好的持久分配器类persistent_alloc<T>,它允许我在持久内存中分配C++容器对象和字符串,该内存由一个mmaped文件支持,该文件可以从我的程序的一次运行到下一次运行.

当我想做任何混合持久和非持久对象的事情时,我的问题就来了.例如,我有

typedef std::basic_string<char, std::char_traits<char>, persistent_alloc<char>> pstring;

pstring a, b, c;
std::string x, y, z;
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

if (a == x)
    a = y;
c = z + b;
Run Code Online (Sandbox Code Playgroud)

等等,但默认情况下它不工作,作为pstringstd::string不相关类型.就比较而言,我可以定义:

template<typename Alloc1, typename Alloc2> inline bool
operator==(const std::basic_string<char, std::char_traits<char>, Alloc1> &a,
           const std::basic_string<char, std::char_traits<char>, Alloc2> &b)
{
    return strcmp(a.c_str(), b.c_str()) == 0;
}
Run Code Online (Sandbox Code Playgroud)

...现在我可以比较字符串的相等性.但是为每个操作添加这些操作似乎很痛苦 - 似乎它们应该由标准库提供.更糟糕的是,赋值运算符和复制构造函数必须是成员,不能像这样定义为全局内联函数.

这样做有合理的方法吗?或者我是否必须有效地重写整个标准库以有效地支持分配器?

c++ c++11

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

重载std :: function参数以匹配lambda

可能重复:
消除对带有std :: functions的函数的调用
不是它的类型的std :: function部分的模板参数(签名)?

我想重载一个函数,以便可以使用各种不同的lambda(通常带有更多或更少的参数)来调用它.我试过的显而易见的事情是:

#include <functional>
#include <iostream>

extern void fn(std::function<void(int)>);
extern void fn(std::function<void(int, int)>);

void test()
{
    fn([](int a) { std::cout << "lambda with 1 arg " << a << std::endl; });
}
Run Code Online (Sandbox Code Playgroud)

但是,这与g ++(试过v4.6.2和v4.7.1)失败并出现错误:

test.cc: In function ‘void test()’:
test.cc:9:74: error: call of overloaded ‘fn(test()::<lambda(int)>)’ is ambiguous
test.cc:9:74: note: candidates are:
test.cc:4:13: note: void fn(std::function<void(int)>)
test.cc:5:13: note: void fn(std::function<void(int, int)>)
Run Code Online (Sandbox Code Playgroud)

现在我在这里这里找到了另一种(也就是更复杂的)方法,但我的问题是,为什么上面的代码失败了?标准中是否有某些内容表明它无法正常工作,或者这仅仅是g ++的错误/限制?

c++ lambda g++ c++11

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

使用std :: reference_wrapper作为std :: map中的键

我在类层次结构中有一堆对象,并希望std::map使用对这些对象的引用作为映射中的键.它似乎std::reference_wrapper正是这需要的,但我似乎无法使它工作.到目前为止我尝试过的:

class Object { // base class of my hierarchy
    // most details unimportant
public
    virtual bool operator< (const Object &) const;  // comparison operator
};

std::map<std::reference_wrapper<const Object>, int> table;

auto it = table.find(object);

table[object] = 42;

table[object]++
Run Code Online (Sandbox Code Playgroud)

但是,我总是从编译器中得到一些模糊的错误:

/usr/include/c++/4.5.3/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::reference_wrapper<const Object>]’:
/usr/include/c++/4.5.3/bits/stl_tree.h:1522:38:   instantiated from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::find(const _Key&) [with _Key = std::reference_wrapper<const Object>, _Val = std::pair<const …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

9
推荐指数
2
解决办法
4623
查看次数

调试可怕的'应用程序无法初始化'错误

我尝试运行我在Windows上构建的可执行文件时偶尔遇到此错误,但我不知道是什么原因导致它或如何修复它.使用普通的MSVC调试器,它只会弹出一个对话框并退出,没有机会做任何事情或查看任何内容.我已经设法至少捕获了一些东西并使用Microsoft控制台调试器获得了堆栈跟踪,但我不知道从这里看什么.在获得我的程序的主要功能或运行我的任何代码之前,似乎在ntdll.dll中奇怪地失败了.

C:\> cdb bugrepro
Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: bugrepro.exe
Symbol search path is: C:\SYMBOLS
Executable search path is:
ModLoad: 00400000 00447000   bugrepro.exe
ModLoad: 7c900000 7c9af000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 10000000 1002a000   glut32.dll
ModLoad: 5ed00000 5edcc000   C:\WINDOWS\system32\OPENGL32.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f02000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 77f10000 77f59000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 68b20000 68b40000   C:\WINDOWS\system32\GLU32.dll
ModLoad: 73760000 737ab000 …
Run Code Online (Sandbox Code Playgroud)

windows debugging dll windbg

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

在内联函数中访问静态全局变量

我遇到了一个奇怪的问题,我缩小到以下测试用例:

inl.h:

inline const char *fn() { return id; }
Run Code Online (Sandbox Code Playgroud)

a.cc:

#include <stdio.h>

static const char *id = "This is A";

#include "inl.h"

void A()
{
    printf("In A we get: %s\n", fn());
}
Run Code Online (Sandbox Code Playgroud)

b.cc:

#include <stdio.h>

static const char *id = "This is B";

#include "inl.h"

void B()
{
    printf("In B we get: %s\n", fn());
}

extern void A();

int main()
{
    A();
    B();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,当我编译它时g++ -O1 a.cc b.cc它似乎正常工作.我明白了:

In A we get: This is A …
Run Code Online (Sandbox Code Playgroud)

c++ gcc

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

各种MaxMind GeoIP缓存模式的含义是什么?

我正在尝试使用MaxMind GeoIP数据库,我注意到C API提供了一堆不同的缓存模式作为GeoIP_open初始化调用的标志.

  • GEOIP_MEMORY_CACHE
  • GEOIP_CHECK_CACHE
  • GEOIP_INDEX_CACHE
  • GEOIP_MMAP_CACHE

这些是标志位,因此您可以提供它们中的任何一组,但是没有关于这些标志的含义或它们的作用,或者(或许最重要的)它们如何交互的文档.

基准测试页面显示,GEOIP_MEMORY_CACHE使得它的速度,同时GEOIP_CHECK_CACHE使得它更慢,但没有迹象显示,为什么你会想使用(或不使用)这些标志.

geoip

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

调试gdb漂亮打印机

我已经开始尝试为某些C ++数据结构构建gdb漂亮的打印机,但是文档非常薄。

结果,我需要猜测如何做,而且我的漂亮打印机经常会因无用的python异常而崩溃,而没有指示实际问题在哪里。

有什么好的调试漂亮打印机的方法吗?通过在代码中插入对pydb的显式调用,我在其他python程序中取得了成功:

import pydb
pydb.debugger()
Run Code Online (Sandbox Code Playgroud)

但这在gdb中运行python时似乎不起作用-它只是在debugger调用之后运行,并且不会停止,说或做任何事情。

python debugging gdb pretty-print

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

在automake中为目标添加依赖项

我遇到了一个与automake有关的问题,我似乎无法找到一个干净的解决方案,看起来它应该是可能的(甚至简单),但没有什么简单的工作.

基本上我遇到的问题是源文件包含自动生成的头文件.我可以添加依赖项来生成头文件只是文件,一旦标题存在,一切正常,因为automake的自动依赖生成处理所有事情.问题是一次在干净的树中运行make时,依赖文件不存在,因此automake不知道生成头文件,这使得包含头的文件的编译失败而不产生任何依赖.这是一个鸡蛋问题 - 你需要手动告诉(自动)make来构建头文件.

显而易见的解决方案是在头文件的Makefile.am文件中添加依赖项,但这不起作用,因为对目标的依赖关系会覆盖automake的自动规则生成,正如文档所说:

请注意,Automake不会区分具有命令的规则和仅指定依赖关系的规则.因此,如果不重新定义整个规则,则无法将新的依赖项附加到automake定义的目标.

现在我通过"隐藏"来自automake的依赖来解决这个问题,但这仅适用于GNU-make:

Makefile.am:

bin_PROGRAMS = foo
foo_SOURCES = main.c foobar.c baz.c

gen.h: system.spec
        ...command to regen gen.h

# foobar.c #includes gen.h, so it needs to exist prior to compiling foobar.c
$(eval foo-foobar.o: gen.h)
Run Code Online (Sandbox Code Playgroud)

这样做,但看起来很难看.是否有更好的自动安全方式来做到这一点?

automake

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

COMMA 移位/减少误差 bison

A: constant
 | OPENINGBRACES B C 
;

constant: INTEGER | REAL | CHARACTER ;

C: CLOSINGBRACES
 | COMMA CLOSINGBRACES
;

B: A
 | A COMMA B 
;
Run Code Online (Sandbox Code Playgroud)

该语法正在产生移位/减少错误。使用 -v 选项运行它后,它显示状态 7 中的冲突..

**
state 7

8 B: A .
9  | A . COMMA B

COMMA  shift, and go to state 10

COMMA     [reduce using rule 8 (B)]
$default  reduce using rule 8 (B)
**
Run Code Online (Sandbox Code Playgroud)

规则 8 是
8 B: A

bison

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

标签 统计

c++ ×4

c++11 ×3

debugging ×2

automake ×1

bison ×1

dll ×1

g++ ×1

gcc ×1

gdb ×1

geoip ×1

lambda ×1

pretty-print ×1

python ×1

windbg ×1

windows ×1