小编Dav*_*hun的帖子

`const shared_ptr <T>`和`shared_ptr <const T>`之间的区别?

我正在为C++中的共享指针编写一个访问器方法,如下所示:

class Foo {
public:
    return_type getBar() const {
        return m_bar;
    }

private:
    boost::shared_ptr<Bar> m_bar;
}
Run Code Online (Sandbox Code Playgroud)

因此,为了支持getBar()返回类型的常量应该是一个boost::shared_ptr阻止Bar它指向的修改.我的猜测shared_ptr<const Bar>我希望返回的类型,但是const shared_ptr<Bar>会阻止指针本身的重新分配指向不同Bar但允许修改Bar它指向的......但是,我不确定.我很感激,如果有人知道肯定可以证实这一点,或者如果我弄错了就纠正我.谢谢!

c++ boost const shared-ptr

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

git标签适用于所有分支吗?

我用git标记弄湿了,但我之前的背景是Subversion,其中"标签"实际上只是副本,而不是"真正的"标签......

如果我将标签添加到git仓库,它是应用于所有分支还是仅应用于当前分支?

例如,如果我目前有这些分支(git branch -v):

* master deadbeef My master head comment
  dev    baddfeed My def head comment
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当前已检出的分支是主分支.现在假设我git tag -a TAGNAME,TAGNAME仅适用于deadbeef(主分支)或baddfeed(dev分支)?

例如,假设我在签出标签之前切换到dev分支(即,不是创建标签的分支):

git checkout dev
git checkout TAGNAME
Run Code Online (Sandbox Code Playgroud)

然后,我最终结账baddfeed或将标签结帐(第二行)切换回主分支(标签创建的位置)并给我一个结帐deadbeef?(或者第三种选择,是我对创建和恢复标签的理解太缺陷或过于简单,答案就像这两个选项中的一个一样简单?)

另外,如果我使用轻量级标签(git tag TAGNAME)而不是带注释的标签,我的问题的答案是否会改变?

git branch git-tag git-branch

14
推荐指数
3
解决办法
7873
查看次数

在Boost Log中,如何使用格式字符串格式化自定义severity_level?

我在我的C++程序中使用boost log,并且我severity_logger< severity_level >使用了我定义的severity_level枚举.然后我用格式字符串创建我的日志接收器,"%TimeStamp% [%ThreadID%] %Severity% %Module% - %Message%"但它没有显示我所拥有的严重性,%Severity%而是在该位置只是空白.例如,2013-07-29 10:31 [0xDEADBEEF] my.Module - Hello World.我需要在格式字符串中执行哪些操作才能显示严重性级别?

这是我的代码的一部分:

#define NUM_SEVERITY_LEVELS 6
enum severity_level
{ 
  // These are deliberately the same levels that log4j uses
  trace = 0,
  debug = 1,
  info = 2,
  warning = 3,
  error = 4,                  
  fatal = 5                   
};  

typedef src::severity_logger< severity_level > logger_t;

const char* severity_level_str[NUM_SEVERITY_LEVELS] = {
  "TRACE",
  "DEBUG",
  "INFO",
  "WARNING",
  "ERROR",
  "FATAL" 
};

template< typename CharT, typename …
Run Code Online (Sandbox Code Playgroud)

boost boost-log

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

Object.wait()方法在抛出异常时是否重新获取监视器?

我正在使用的Java文档清楚地表明,该Object.wait()方法在返回之前需要关联的监视器,无论它是否被通知或者是虚假的唤醒; 任何正常方法返回都将在监视器重新获取之前.

但是,在事件Object.wait()抛出异常时会发生什么,例如,a Interrupted Exception.我推断它确实在抛出异常之前重新获取了锁.但是,文档并没有非常明确,所以我不是100%肯定...

这是我正在查看的文档:http: //docs.oracle.com/javase/6/docs/api/java/lang/Object.html#wait%28%29

那么,我的推理是正确的,还是我的调用代码需要在抛出异常后解决监视器状态(例如,必要时重新获取它)?

java synchronization signals exception-handling wait

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

为什么不允许将void *的static_cast转换为其他类型?

我只是在阅读此线程: 简单的c ++指针转换

这使我开始思考为什么不允许在不同的指针类型之间进行static_cast(除非在这种情况下除外),除非您将static_cast转换为void *作为中间步骤。在我看来,这两者都不应该允许。这是一个例子:

char*          cs;
unsigned char* ucs;

cs = reinterpret_cast<char*>(ucs);                  // 1) allowed, of course
cs = static_cast<char*>(ucs);                       // 2) not allowed: incompatible pointer types
cs = static_cast<char*>( static_cast<void*>(ucs) ); // 3) now it's allowed!
Run Code Online (Sandbox Code Playgroud)

在我看来,如果可能#3,那么也应该允许#2。或者相反,如果由于指针不兼容(需要reinterpret_cast)而不允许#2,则也许可能由于指针不兼容而不允许 void *到任何对象的static_casting 。(当然,从任何其他指针投射 void *总是可以的。)

那么,为什么其中一种可能性不成立-#2和#3要么都允许,要么都不允许?为什么反而如我的示例所示起作用?

c++ pointers casting void-pointers static-cast

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

如何手动冲洗升压日志?

我正在使用Boost.Log中的boost 1.54.0来查看它是否适用于我的应用程序.一般来说,我没有缓冲问题,所以我不打算打开auto_flush或其他任何东西......但是我注意到在我调用之前记录的消息fork()是重复的,我想知道它是否是因为它们是缓冲的,所以在复制过程映像时缓冲区会被复制,然后两个进程最终将它们的缓冲区副本写入日志文件......

所以基本上,我只想在我打电话之前在日志上做一次手动刷新,fork()以确保没有消息仍然在内存中.换句话说,我正在寻找一个类似于fflush(),.flush(),<< flush等我可以在升压日志使用.

我确实尝试使用<< flush日志,但我仍然得到重复的消息,所以我不是100%确定它是否正在刷新并且重复是由其他一些问题引起的,或者它是否以某种方式默默地忽略了<< flush...

编辑:

我环顾四周,发现升压日志不是叉安全的.所以我应该补充一点,我不是想在父进程和子进程中使用相同的日志.我有两个分叉场景 - 在一个,父母立即终止和孩子contineus(这应该是安全的),而在另一个,孩子应该打开自己的单独的日志文件,所以这应该是安全的...但我需要弄清楚如何关闭日志文件接收器,然后打开一个新文件(在不同的文件上).我想关闭水槽也可能是一种强制冲洗的方法......?

c++ boost flush boost-logging boost-log

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

如何在Windows 7上使用MinGW编译boost之前构建Boost.Build?

我正在运行Windows 7 Enterprise SP1并尝试设置C++开发环境.我安装了MinGW,这似乎可以自己正常工作.接下来,我需要安装boost ...似乎唯一不错的选择是从源代码编译.(我没有看到任何官方的Windows二进制文件.我发现了几个非官方的二进制文件,但它们往往是当前的几个版本,并且不清楚它们是否被维护.)

所以我下载了tarball,解压缩,从MinGW打开MSYS shell,转到tools/build/v2并运行bootstrap.sh - 这失败了,bootstrap.log读取如下:

###
### Using 'gcc' toolset.
###
rm -rf bootstrap
mkdir bootstrap
gcc -o bootstrap/jam0 command.c compile.c constants.c debug.c execcmd.c frames.c function.c glob.c hash.c hdrmacro.c headers.c jam.c jambase.c jamgram.c lists.c make.c make1.c object.c option.c output.c parse.c pathsys.c pathunix.c regexp.c rules.c scan.c search.c subst.c timestamp.c variable.c modules.c strings.c filesys.c builtins.c class.c cwd.c native.c md5.c w32_getreg.c modules/set.c modules/path.c modules/regex.c modules/property-set.c modules/sequence.c modules/order.c execunix.c fileunix.c
builtins.c:34:23: fatal error: sys/wait.h: No such file or …
Run Code Online (Sandbox Code Playgroud)

windows boost mingw build boost-build

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