小编Dan*_*aum的帖子

在标准中,什么是"派生声明者类型"?

在C++(C++ 11)标准的不同位置,声明是根据derived-declarator-type-list描述的.我正在研究右值引用,在这种情况下使用这个术语是至关重要的(§8.3.2):

在声明TD中,其中D具有任一形式
    &attribute-specifier-seq opt D1
    && attribute-specifier-seq opt D1
和声明中的标识符类型T D1是" derived-declarator-type-list T ",那么D的标识符的类型 是" 对T的derived-declarator-type-list reference ".

不幸的是,类别" derived-declarator-type "从未在标准中定义.(我查看了"衍生"这个词的每一次使用,此外这可能在这里这里得到确认.)

因为" derived-declarator-type-list "是斜体,我认为它指的是一个类别,而不是一个变量标签T,因此(因此,我不同意Doug Gwyn在我刚刚给出的第二个链接中的评估"我们可以使用X而不是' derived-declarator-type-list '").

在C++ 11标准中,derived-declarator-type的定义是什么?

c++ standards c++11

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

构建C++应用程序时OSX系统包含文件的默认路径是什么?

我正在命令行构建一个C++应用程序(使用make开源库(Xerces 2.8)).其中一个文件包含一个OSX系统文件,

#include <TextUtils.h>
Run Code Online (Sandbox Code Playgroud)

当我键入make -n以确定用于编译给定文件的命令时,没有提供系统框架文件的包含路径.因此,我假设在OSX上,gcc编译器在系统包含文件的默认位置查找.

我想知道这个位置是什么.当我搜索时TextUtils.h,我在不同位置看到该文件的许多版本,包括可能是默认位置的几个不同的可能候选者.

如何确定系统用于系统包含文件的默认路径?

c++ macos

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

来自Josuttis:不同的模板函数,实例化给定特定类型的相同函数签名,会导致ODR无效吗?

在Josuttis和Vandevoorde着名的模板书C++模板:完整指南中,他们讨论了有关函数模板重载的细节.

在他们的一个示例中,与函数签名和重载函数模板的讨论相关,它们呈现了他们用以下术语描述的代码:

This program is valid and produces the following output:

(Note: Output shown below)
Run Code Online (Sandbox Code Playgroud)

但是,当我在Visual Studio 2010中构建和编译相同的代码时,我得到了不同的结果.这让我相信VS 2010编译器产生的代码不正确,或者Josuttis代码有效是不正确的.

这是代码.(Josuttis 2003,Section 12.2.1)

// File1.cpp

#include <iostream>

template<typename T1, typename T2>
void f1(T2, T1)
{
    std::cout << "f1(T2, T1)" << std::endl;
}

extern void g();

int main()
{
    f1<char, char>('a', 'b');
    g();
}
Run Code Online (Sandbox Code Playgroud)

...

// File2.cpp

#include <iostream>

template<typename T1, typename T2>
void f1(T1, T2)
{
    std::cout << "f1(T1, T2)" << std::endl;
}

void g()
{
    f1<char, char>('a', 'b'); …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

与knockout.js的Bootstrap popover

我有一个应用程序通过AJAX调用接收一些数据.之后,接收到的数据使用knockout.js库绑定到DOM元素.我想使用boostrap的不引人注意的标记来创建像这样的popovers:

<table class="table table-condensed" data-bind="foreach: items">
    <tr>
        <td><b data-bind="text: $data.id"></b></td>
        <td data-bind="text: $data.title"></td>
        <td><a href="#" rel="popover" data-bind="attr: {title: $data.info}" data-placement="top">Info</a></td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

根据最新的bootstrap文档,$('.popover').popover()不需要隐式调用类似的东西,但它不起作用.

我想,boostrap.js在document.ready上执行一些DOM分析,并执行popover工作所需的所有工作.问题是:有没有办法告诉bootstrap.js在收到AJAX响应后执行类似的数据工作?或者如何实现这种要求?

ajax twitter-bootstrap knockout.js

12
推荐指数
2
解决办法
9915
查看次数

如何确定是否通过注册表可靠地在用户的计算机上安装了32位Visual Studio 2013可再发行组件?

我正在使用DeployMaster为使用Qt用C++编写的32位Windows应用程序构建安装程序.

可执行文件取决于Visual Studio 2013可再发行组件 - 即,在运行此应用程序之前,最终用户必须安装32位Visual Studio 2013可再发行组件.

我用谷歌搜索,并查看其他StackOverflow问题.特别是,此链接提供了要检查的确切注册表项,但对于VS 2008的情况.

我需要VS 2013,而不是VS 2008.

但是,理想情况下,它将是一个可靠的注册表检查 - 而不是程序化解决方案 - 因为我可以使用DeployMaster安装程序轻松检查注册表项.(如果确定系统没有安装可再发行组件,则可以轻松地让DeployMaster安装程序启动安装程序.)

是否有人知道一种可靠的方法,最好使用注册表项,以便确定是否可以在最终用户的计算机上安装32位VS 2013可再发行组件?

windows registry redistributable visual-studio visual-studio-2013

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

如何使用Enterprise Architect或Rational Software Architect从源代码创建类图?

我不熟悉UML,但我想基于现有的C++代码创建一个类图.其他StackOverflow问题表明,两个程序--Enterprise Architect和Rational Software Architect - 相当擅长"逆向工程"C++代码(即,基于现有的C++代码创建UML类图).

我已经下载了这两个应用程序的试用版.但是,我无法理解如何在这些应用程序中创建类图.

在Rational Software Architect中,我创建了一个UML项目,但我无法在程序中找到任何方法来选择和反向工程我现有的C++代码.

在Enterprise Architect中,我能够导入我的C++代码,但所有元素(类)都出现在图中无用的重叠对角线上.我尝试其他设置,如圆形,但这些也同样是不可能的阅读,因为图中是如此之大(由于占用了很多空间的属性和方法),没有平移和缩放的量是有益的.我想要的是隐藏除类名之外的所有内容(即,不显示任何方法或属性),以便所有20个类在一个屏幕中方便且清晰地显示.

但是,我无法找到隐藏除类名之外的所有内容的方法.相反,当我发现一个选项(在Enterprise Architect中)似乎可能隐藏除了类名之外的所有内容时,由于某种原因,这些元素在类图中都消失了,并且没有重复步骤,删除和重新添加包使类图重新出现.

注意:我的C++代码(至少我选择导入Enterprise Architect的那些文件)只有大约20个类.

遗憾的是,对这两个程序的文档进行非常仔细的搜索只能提供一般性 - 就我所能找到的任何一个程序,没有给出关于逆向工程的具体说明.

如果有人能告诉我创建易读,易于导航的图表的基本步骤,我将不胜感激.反向工程(即C++ - to-UML)只显示类名,因此大约20个类在一个屏幕上适合(清晰),使用Enterprise Architect或Rational Software Architect - 或任何其他任何能够使用的工具这样做(我建议EA和Rational只是因为它们已在其他StackOverflow答案中突出显示为可用于此目的的最佳程序).

c++ uml enterprise-architect

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

在C++标准中,它在哪里表示用它代表的源代码替换类别描述符的间隔协议?

提出一个被认为过于挑剔的问题的风险,我花了很长时间试图证明(作为在不同背景下贯穿整个标准的事物的一个例子)下面的integer literal§2.14.2中的定义.C++ 11标准,特别是关于一个细节,在语法符号本身中存在空格.

(注意,这个例子 - 整数文字的定义 - 不是我的问题.我的问题是询问C++标准本身使用的语法描述符号,特别是关于语法类别名称之间的空格我在这里给出的例子 - 整数文字的定义 - 是专门选择的,因为它只是一个简单明了的例子.)

(缩写为简称,来自§2.14.2):

integer-literal:
    decimal-literal integer-suffix_opt

decimal-literal:
    nonzero-digit
    decimal-literal digit
Run Code Online (Sandbox Code Playgroud)

(有nonzero-digitdigit如预期的,[0] 1 ... 9).(注意:上面的文字在标准中都是斜体.)

这一切对我来说很有意义,假设语法范畴描述内容之间的空间decimal-literaldigit被理解为不会出现在实际的源代码,但只出现在语法描述本身,因为它出现在这里部分§2.14.2.

这种约定 - 在符号中的类别描述符之间放置一个空格,其中理解该空间不存在于源代码中 - 在规范中的其他地方使用.这里的例子只是一个明确的案例,其中显然不应该在源代码中出现空格.(参见此问题的附录,其中包含空格或其他分隔符必须存在的标准的反例,或者当源类型中的实际标记替换这些类别描述时,类别描述之间是可选的.)

同样,冒着被挑剔的风险,我无法在标准的任何地方找到一个约定声明,在解释符号时,例如在本例中,空格不会出现在源代码中.

该标准确实讨论了§1.6.1(及其后)中的符号约定.我能找到的唯一相关文字是:

在本国际标准中使用的语法表示法中,句法类别以斜体类型表示,文字词语和字符以恒定宽度类型表示.替代方案在单独的行中列出,除了少数情况下,一长串备选方案用短语"one of"标记.

我不会那么挑剔; 但是,我发现标准中使用的符号有些棘手,所以我想清楚所有细节.我感谢任何愿意花时间来填补这个问题的人.

附录 为了回应一些声明,其中声明类似于" 很明显,最终源代码中不应包含空格,因此标准无需明确说明 ":我在这个问题中选择了一个简单的例子,明显.有许多情况下,它的标准是不是很明显没有.先验的语言知识(在我看来),如§8.0.4讨论"const"和"volatile":

cv-qualifier-seq:
    cv-qualifier cv-qualifier-seq_opt
Run Code Online (Sandbox Code Playgroud)

...请注意相反的假设(最终源代码中需要空格或其他分隔符或分隔符),但这不可能从语法表示法本身推断出来.

还有一些空间是可选的,例如:

noptr-abstract-declarator:
    noptr-abstract-declarator_opt parameters-and-qualifiers
Run Code Online (Sandbox Code Playgroud)

(在这个例子中,为了说明一点,我不会给出部分编号或解释正在讨论的内容;我只是问一下,从语法符号本身来看,在这个上下文中,最终源代码中是否有空格在令牌之间是可选的.)

我怀疑沿着这些方向发表的评论 - "很明显,这就是它必须是什么" …

c++ standards c++11

10
推荐指数
3
解决办法
486
查看次数

STL"擦除 - 删除"成语:为什么不"调整大小 - 删除"?

通常理解的std::vector是,从a中完全删除所需项目的好方法是擦除 - 移除习语.

如上面链接中所述(截至本帖发布之日),在代码中,erase-remove惯用法如下所示:

int main()
{
  // initialises a vector that holds the numbers from 0-9.
  std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

  // erase-remove idiom to completely eliminate the desired items from the vector
  v.erase( std::remove( std::begin(v), std::end(v), 5 ), std::end(v) ); 
}
Run Code Online (Sandbox Code Playgroud)

我想知道resize-remove成语在功能和性能方面是否与成语相同erase-remove.或者,也许我错过了一些明显的东西?

以下resize-remove成语是否等同于上述erase-remove成语?

int main()
{
  std::vector<int> v = { 0, 1, 2, 3, …
Run Code Online (Sandbox Code Playgroud)

c++ stl erase-remove-idiom

10
推荐指数
2
解决办法
3498
查看次数

为什么两阶段查找无法选择'swap'的重载版本?

我正在研究这个关于实现用户定义类型函数最佳实践微妙问题的这个有趣的答案.(我的问题最初的动机是讨论将名称添加到命名空间的非法性.)swapstd

我不会在这里重新打印上面链接的答案中的代码片段.

相反,我想了解答案.

答案我上面的状态联系在一起,第一代码片段之下,在关于超载swapnamespace std(而不是专门在的命名空间):

如果您的编译器打印出不同的东西,那么它就不能正确地为模板实现"两阶段查找".

然后答案指出,专门swap研究namespace std(而不是重载它)会产生不同的结果(在专业化的情况下是期望的结果).

但是,答案继续进行另外一种情况:为用户定义的模板类专门交换 - 在这种情况下,再次无法实现所需的结果.

不幸的是,答案只是陈述事实; 它没有解释原因.

有人可以详细说明这个答案,并在该答案中提供的两个特定代码片段中描述查找过程:

  • 过载swapnamespace std为用户定义的非模板类(如在联答复的第一代码段)

  • 专注swapnamespace std用户定义的模板类(如链接答案的最终代码段)

在这两种情况下,std::swap都会调用泛型,而不是用户定义的泛型swap.为什么?

(这将阐明两阶段查找的本质,以及实现用户定义swap最佳实践的原因;谢谢.)

c++ templates swap argument-dependent-lookup c++11

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

Git Merge:通过在合并文件中包含相同的代码块TWICE而无怨言地合并并行相同的添加而没有冲突.为什么?

我在我的Git日志中有一个有点棘手的历史,我试图完全理解.

在解释提交顺序之前,让我粘贴Git日志的图像(使用SmartGit可视化历史记录)来查询相关文件:

git_history_later

...

git_history_earlier

显示的是与我的问题相关的Git历史,不相关的中间部分被剪掉了.

两位开发人员对相关文件(Developer 1和Developer 2)进行了代码更改.

开发人员1

  • 检查图片中标有" origin/staging " 的分支(但在签出时也是' origin/development ')
  • 添加一个小代码块(见下文)
  • 提交和推送 - 此推送标记为' jon-dev-test-merge ',上面
  • 对前一次提交的代码进行简单的空格更改,并提交/推送此空白更改,标记为" jon-dev-test-merge-2 ",上面
  • 意识到他本应该在一个单独的分支上工作,所以重新开始并检查' origing/staging '(当时,' origin/development '),进入一个名为' jons_dev ' 的新分支,他推动它,并设置跟踪起源
  • 将相同的小代码块(不包括空格更改)添加到此新分支(蓝线)(在标记为' test-merge-sales ' 之前的某个时间进入提交)
  • 后来,看到开发人员2已就"改变产地/发展 "分支,合并" 产地/发展 "为他的" jons_dev "分支

与此同时...

开发人员2

  • 检查图片中标有" origin/staging " 的分支(但在签出时也是' origin/development ')
  • 将代码更改为另一个文件(与上面的Developer 1中的代码更改完全无关) - 这是他在本地开发机器上的工作副本
  • 将Developer 1的代码更改为" origin/development "分支,并将其合并到本地分支/工作副本中; 合并成功,没有冲突.请注意,我们没有看到Developer 2合并到他的本地分支中(因为他没有将该分支推送到原点),而只是从他的本地分支合并(参见下一个要点)回到' origin/development ' 那个时候的分支.
  • 从本地机器上的原点合并到跟踪的开发分支中,并将合并推回原点 - 标记为' vladimir-test-merge ',上面

到现在为止还挺好.

这是我的问题.

在理解上述事件序列的过程中,我注意到一些奇怪的事情 - 对于有问题的文件, " 起源/开发 "分支没有任何变化需要合并到标记为" …

git merge

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