小编pes*_*che的帖子

为什么C++好友类只需要在其他命名空间中使用前向声明?

假设我有一个类F应该是类G(在全局命名空间中)和C(在命名空间中A)的朋友.

  • 要成为朋友A::C,F必须向前宣布.
  • 要成为朋友G,没有F必要的前瞻性声明.
  • 同样,一个班级A::BF可以成为朋友而A::C无需前瞻性声明

下面的代码说明了这一点,并使用GCC 4.5,VC++ 10以及至少与另一个编译器进行编译.

class G {
    friend class F;
    int g;
};

// without this forward declaration, F can't be friend to A::C
class F;

namespace A {

class C {
    friend class ::F;
    friend class BF;
    int c;
};

class BF {
public:
    BF() { c.c = 2; }
private:
    C c;
};

} // …
Run Code Online (Sandbox Code Playgroud)

c++ namespaces friend forward-declaration

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

如何在仅头文件库中拥有静态数据成员?

在非模板库类中拥有静态成员的最佳方法是什么,而不必在类用户上承担定义成员的负担?

说我想提供这个课程:

class i_want_a_static_member
{
    static expensive_resource static_resource_;

public:
    void foo()
    {
        static_resource_.bar();
    }
};
Run Code Online (Sandbox Code Playgroud)

那么类的用户一定不要忘了某处定义静态成员(如已经回答了 很多 ):

// this must be done somewhere in a translation unit
expensive_resource i_want_a_static_member::static_resource_;
Run Code Online (Sandbox Code Playgroud)

我在下面有一个答案,但它有一些缺点.是否有更好和/或更优雅的解决方案?

c++ static-members header-only

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

发生错误时,GNU可以执行规则吗?

这与Make a Makefile仅在发生错误时执行代码略有不同.

我想要在发生错误时制定规则或特殊目标(独立于给定目标;不更改每个目标的规则,因为另一个答案似乎暗示了||运算符).

dmake的特殊目标 .ERROR每当检测到错误条件时执行.GNU make有类似的东西吗?

(我还在使用GNU make 3.81,但我在新的GNU make 4.0的文档中找不到任何内容)

error-handling makefile gnu-make dmake

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

CLion中的大型CMake项目加载速度很慢

我正在尝试将几个基于makefile的大型应用程序转换为CMake,以便在它们上使用CLion.

然而,每当我打开项目时,CLion需要大约四分之一个小时来加载CMake项目,而内存指示器仍然低于"1987MB的750".我承认我是一个CMake新手,所以我猜我的CMakeLists.txt文件不是最佳的.

基本上每个应用程序在其自己的目录中都有一些特定的源代码,并且使用了几个"通用"库.我在github上做了一个结构上等效的共享项目:

https://github.com/pe-st/zalophus/tree/master/tree

在该项目中,有一个应用程序'a'和两个常见的图书馆'地图集'和'问候'.每个库都包含一个带有Googletest测试的文件夹'test'.

+ common
| + atlas
| | + test
| + greeting
|   + test
+ a
Run Code Online (Sandbox Code Playgroud)

实际上,大约有十几个库共有约1500个.cpp和.hpp文件,所有这些文件都使用Boost和标准库,没有别的.

github上项目的主分支包含我的第一次尝试,其中所有目录都使用'add_subdirectory'引用.第二次尝试(在with_ext分支中)使用ExternalProject_Add作为依赖库.当我从'greeting'编译/运行测试时,它正确地编译了依赖'atlas'.然而,它也试图编译/运行'atlas'的测试(失败......),我无法解决如何在没有测试的情况下编译'atlas'.

那么我应该如何更好地设计CMake项目以使用如图所示的源代码库?

(注意:我也在Jetbrains CLion论坛上提出了同样的问题:https://intellij-support.jetbrains.com/hc/en-us/community/posts/207559245-Large-CMake-Project-loading-is- 慢慢地在 - 克里昂 -)

cmake clion

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

是否存在像C++ STL的`transform`这样的Objective-C算法?

我的目标是拥有一个包含特定扩展名的所有文件名但没有扩展名的数组.

有一个优雅的解决方案,使用谓词过滤器获取特定扩展的所有文件名,以及如何将路径拆分为文件名和扩展名的说明,但要合并它们,我必须编写一个循环(不是很糟糕,但也不优雅).

是否有一种方法使用Objective-C(可能类似于谓词机制)将一些函数应用于数组的每个元素,并将结果放在第二个数组中,就像transformC++ STL 的算法一样?

我想写的:

// let's pretend 'anArray' was filled by querying the filesystem and not hardcoded
NSArray* anArray = [[NSArray alloc] initWithObjects:@"one.ext", @"two.ext", nil];

// that's what I liked to write (pseudo code)
NSArray* transformed = [anArray transform: stringByDeletingPathExtension];

// Yuji's answer below proposes this (which may be as close as you can get
// to my wish with Objective C)
NSArray* transformed = [anArray my_arrayByApplyingBlock:^(id x){
                           return [x …
Run Code Online (Sandbox Code Playgroud)

arrays algorithm objective-c

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

是否有可能在步骤中使用hgsubversion进行克隆?

我正在尝试使用hgsubversion克隆一个相当大的subversion存储库.

hg clone --startrev 8890 svn+https://my.reposit.ory/trunk trunk_hg
Run Code Online (Sandbox Code Playgroud)

大约一个小时后,clone操作将以内存不足消息中止:

[r20097] user: description
abort: out of memory
Run Code Online (Sandbox Code Playgroud)

是否可以为操作指定最终修订clone版本并使用pull?获取剩余的修订版本?或者以某种方式分解clone更小的步骤?

mercurial clone hgsubversion

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

Visual C++ 10小写__FILE__宏

__FILE__Visual C++ 10中的预处理器宏扩展为源模块的名称,但是以小写形式,例如

c:\path\to\my\file\somesource.cpp
Run Code Online (Sandbox Code Playgroud)

当文件名实际上是

SomeSource.cpp
Run Code Online (Sandbox Code Playgroud)

是否有可能改变这种行为?

visual-studio-2010 visual-studio-2008 visual-c++

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

Emacs:使用cua模式是否存在更好的PgDn / PgUp行为?

我想使用PgUpPgDn键仅将显示的文件的内容向上或向下移动,但是光标(Emacs Lingo中的)应保持在屏幕上的位置。不幸的是,默认的Emacs行为是不同的。默认行为很难描述,但是如果按PgDn后跟,PgUp则最终结果不会像以前一样(!)。

这不是一个新问题,存在一个名为很好的解决方案SFP-向上翻页和SFP-页面向下EmacsWiki

(defun sfp-page-up ()
  (interactive)
  (setq this-command 'previous-line)
  (previous-line
   (- (window-text-height)
      next-screen-context-lines)))
Run Code Online (Sandbox Code Playgroud)

但是,与cua -mode 结合使用时会出现一个问题,该模式提供(尤其是)移位选择(按Shift和光标移动键,例如PgDn开始突出显示选定区域):

cua-mode无法识别重新定义的PgUp/ PgDn键,即它们不开始选择。解决方法是先按键,然后按PgUp/ 继续PgDn

我该如何cua-mode与他人打好关系sfp-page-up/down

emacs keyboard-shortcuts cua cua-mode

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

可以告诉 MapStruct 不执行自动映射吗?

我有一个相当大的 bean(约 100 个属性)映射到几个较小的对象中。可能会出现较小的目标对象具有与我的源 bean 中名称相同但语义不同的属性。

我希望MapStruct在这种特定情况下只映射我使用@Mapping注释明确告诉的内容,而不执行通常的自动映射。

MapStruct文档告诉我,仅此:

在生成的方法实现中,来自源类型 (...) 的所有可读属性都将被复制到目标类型 (...) 中的相应属性中。

我没有找到任何关闭此行为的配置选项。可以做到吗?

java object-object-mapping mapstruct

5
推荐指数
2
解决办法
3034
查看次数

Eclipse拼写引擎不存在

我在Windows上使用Eclipse 3.4(Ganymede)和CDT 5.

当集成的拼写检查器不知道某个单词时,它建议(以及其他)将该单词添加到用户词典的选项.

如果用户词典尚不存在,则拼写检查器提供帮助配置它并显示"常规/编辑/文本编辑器/拼写"首选项窗格.但是,此首选项窗格指出"所选拼写引擎不存在",但无法控制添加或安装引擎.

我怎样才能使用拼写引擎?

更新:解决了我的问题是安装了JDT.这个解决方案在2008-09-07提出并被接受,但现在已经丢失.

c++ eclipse spell-checking eclipse-cdt eclipse-3.4

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

Bazaar:如何将来自不同位置的文件放在一个存储库中?

我是bazaar的新手,想通过将我的Emacs配置文件存储在一个存储库中来尝试一下.

这些文件包含我的主目录中的.emacs文件(在unixish系统上)和/ usr/local/share/emacs/site-lisp中的几个Emacs Lisp源文件

我真的想要一个回购,因为我的.emacs文件中的一些更改与其他文件中的更改一起.

从手册中我无法解决的是如何将这些文件放在一起."bzr init"递归地从当前目录中获取所有文件; 对于我的情况,这将意味着在根目录中创建repo ...

您有什么推荐的吗?尝试使用符号链接?有没有办法将修订从一个仓库与另一个仓库中的一个仓库相关联,这样可以更容易地解决两个单独的仓库的问题?

还有一个挑战:在Windows机器上,这些Emacs文件位于完全不同的位置.怎么治疗呢?

我有一些经验:解决方案很简单:您可以定义一个视图,将repo文件映射到硬盘上的任意位置.

emacs bazaar dot-emacs

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