小编mal*_*lat的帖子

C++ 11:二进制表达式ostream和ostringstream的操作数无效

为什么以下不再是有效的C++ 11代码(编译为C++ 98):

#include <sstream>
#include <iostream>

int main()
{
  std::ostringstream os;
  os << "Hello World!";
  std::cout << os << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这里的参考是(截断)我得到的clang:

$ clang++ -stdlib=libc++ -std=c++11 t.cxx
t.cxx:8:13: error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'std::ostringstream' (aka 'basic_ostringstream<char>'))
  std::cout << os << std::endl;
  ~~~~~~~~~ ^  ~~
/usr/include/c++/v1/ostream:190:20: note: candidate function not viable: no known conversion from 'std::ostringstream' (aka 'basic_ostringstream<char>') to
      'const void *' for 1st argument; take the address of the argument with & …
Run Code Online (Sandbox Code Playgroud)

c++11

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

std :: is_pod vs subclassing

有人可以帮我理解为什么以下代码无法编译(g ++ 4.8).我的理解是可以初始化POD

#include <iostream>
#include <type_traits>

struct my_int
{
  int val_;
};
struct B : public my_int
{
};

int main()
{
  std::cout << std::is_pod<my_int>::value << std::endl;
  std::cout << std::is_pod<B>::value << std::endl;
  const my_int v = { 123 };
  //const B v2 = { 123 }; // does not compile with g++ 4.8.

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译是:

g++ -std=c++11 t.cxx
t.cxx: In function 'int main()':
t.cxx:24:21: error: could not convert '{123}' from '<brace-enclosed initializer list>' to 'const B'
   const …
Run Code Online (Sandbox Code Playgroud)

c++ pod c++11

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

使用CMake的详细NMake Makefile

我一直在遵循常见问题解答中的说明:是否有选项可以产生更多"详细"编译?.我现在有了:

$ cat C:/Program Files/CMake 2.8/share/cmake-2.8/Modules/Platform/Windows.cmake
[...]
# uncomment these out to debug nmake and borland makefiles
set(CMAKE_START_TEMP_FILE "")
set(CMAKE_END_TEMP_FILE "")
set(CMAKE_VERBOSE_MAKEFILE 1)
Run Code Online (Sandbox Code Playgroud)

然后我重新生成我的项目,然后运行nmake:

> cmake --version
cmake version 2.8.12.2

> cmake -G"NMake Makefiles" ..\project
> nmake VERBOSE=1
[...]
[ 73%] Building CXX object apps/foobar/CMakeFiles/bla.dir/my.cpp.obj
    cd C:\Dashboards\MyTests\project-build-debug-vista32-nightly\apps\foobar
    C:\PROGRA~1\MICROS~1.0\VC\bin\cl.exe  @C:\Users\voxxl\AppData\Local\Temp\nm1362.tmp
Run Code Online (Sandbox Code Playgroud)

有没有办法访问完整的cl命令行?

nmake cmake

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

为什么这个for循环使用OpenMP不会更快?

我从一个更大的2D程序中提取了这个简单的成员函数,它所做的只是一个for循环访问三个不同的数组并进行数学运算(1D卷积).我一直在测试使用OpenMP来加快这个特定的功能:

void Image::convolve_lines()
{
  const int *ptr0 = tmp_bufs[0];
  const int *ptr1 = tmp_bufs[1];
  const int *ptr2 = tmp_bufs[2];
  const int width = Width;
#pragma omp parallel for
  for ( int x = 0; x < width; ++x )
    {
    const int sum = 0
      + 1 * ptr0[x]
      + 2 * ptr1[x]
      + 1 * ptr2[x];
    output[x] = sum;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在debian/wheezy amd64上使用gcc 4.7,整个程序在8 CPU机器上执行速度要慢很多.如果我在debian/jessie amd64上使用gcc 4.9(在这台机器上只有4个CPU),整个程序执行的差别很小.

使用time比较:单核运行:

$ ./test black.pgm out.pgm  94.28s user 6.20s system 84% …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing performance openmp

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

自引用类:来自 C 接口的具体 python 类

我正在尝试设计一个可以在 Python 中轻松扩展的 C 接口(使用ctypes)。我在 C 中使用了自然习语

struct format {
    int (*can_open)(const char *filename);
    struct format * (*open)(const char *filename);
    void (*delete)(struct format *self);
    int (*read)(struct format *self, char *buf, size_t len);
};
Run Code Online (Sandbox Code Playgroud)

如果我想直接从 C 扩展这个接口,它工作得很好:

struct derived /* concrete implementation */
{
    struct format base;
};
Run Code Online (Sandbox Code Playgroud)

但我真正想做的是使用 ctypes 从 Python 实现这个接口。这是我到目前为止所拥有的:

CANOPENFUNC   = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_char_p)
#OPENFUNC     = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p)
#OPENFUNC     = ctypes.CFUNCTYPE(ctypes.POINTER( python_format ), ctypes.c_char_p)
#DELETEFUNC   = ctypes.CFUNCTYPE(None, ctypes.c_void_p)
#READFUNC     = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p)

def py_canopen_func( …
Run Code Online (Sandbox Code Playgroud)

c python ctypes creation self-reference

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

了解gcc 4.9.2自动矢量化输出

我正在尝试学习gcc自动矢量化模块.从这里阅读文档后.

这是我尝试过的(debian jessie amd64):

$ cat ex1.c
int a[256], b[256], c[256];
foo () {
  int i;

  for (i=0; i<256; i++){
    a[i] = b[i] + c[i];
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,我只是运行:

$ gcc  -x c -Ofast -msse2 -c   -ftree-vectorize -fopt-info-vec-missed ex1.c
ex1.c:5:3: note: misalign = 0 bytes of ref b[i_11]
ex1.c:5:3: note: misalign = 0 bytes of ref c[i_11]
ex1.c:5:3: note: misalign = 0 bytes of ref a[i_11]
ex1.c:5:3: note: virtual phi. skip.
ex1.c:5:3: note: num. args = 4 (not unary/binary/ternary …
Run Code Online (Sandbox Code Playgroud)

c gcc auto-vectorization

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

在gitlab ci yaml中用空格封装字符串

如何在 GitLab CI YAML 文件中指定包含空格的字符串文字?

例如,我用来调用位于 gitlab-ci.yml 文件中的 C:\Program Files (x86)...\msbuild.exe 的 msbuild.exe,如下所示

build:
   - C:\Program Files (x86)\...\msbuild.exe MySolution.sln
Run Code Online (Sandbox Code Playgroud)

我尝试使用单引号和双引号来封装路径,但失败了。

有任何想法吗?谢谢

powershell yaml gitlab-ci

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

cmake_minimum_required 和子项目

我真的很喜欢拥有我的顶级项目,推动我的子项目的编译。我目前有一棵树,例如:

gdcm -- cmake_minimum_required(VERSION 3.8.2 FATAL_ERROR)
??? Utilities
?   ??? gdcmcharls -- cmake_minimum_required(VERSION 2.8.7)
Run Code Online (Sandbox Code Playgroud)

我想让它尽可能接近我有一个方便的副本的每个不同的上游项目。但是,当我想测试 CMake 的新功能时,我不能简单地更改顶级 CMakeList.txt 文件并希望将新策略传输到单个子项目(根据嵌套命令的定义cmake_minimum_required)。

有没有成语可以这样说:

if(TOPLEVEL PROJECT)
cmake_minimum_required(VERSION 2.8.7)
else()
cmake_minimum_required(VERSION ${INHERITED_VERSION})
endif()
Run Code Online (Sandbox Code Playgroud)

cmake

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

了解 DICOM 应用程序级机密性配置文件和选项

我试图理解表格:

让我们考虑第一个属性:

入藏号 (0008,0050)

我看到此 DICOM 属性从未在任何选项中列出(例如'Clean Desc. Opt.')。这意味着声称符合应用程序级别机密性配置文件和选项作为去标识符的应用程序需要应用'Z'操作代码(就像'C'在不可见列中存在隐式默认操作代码一样):

替换为零长度值,或可能是虚拟值且与 VR 一致的非零长度值

现在,如果我们移动到表中的第二个属性:

收购评论 (0018,4000)

我们看到该属性列在一个且只有一个'Clean Desc. Opt.'带有操作代码的选项中'C'(没有列出带有显式'K'操作代码的选项)。问题是为什么?如果我们假设总是有一个隐含的默认'C'操作代码,为什么标准会在特定列中明确列出它?


根据我的理解,当 'Clean Desc. 选择。' 使用时,会发生以下行为:

  1. 去标识化操作代码'Z'用于登录号 (0008,0050)
  2. 去标识化操作代码'X'用于收购评论 (0018,4000)(显式'C'操作)

当'清洁描述。选择。' 在使用时,下列行为发生:

  1. 去标识化操作代码'Z'用于登录号 (0008,0050)
  2. 去标识化行动代码'X'用于收购评论(0018,4000)(明确'C'行动)

dicom

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

带有泛型的可为空引用的注释

给定以下通用Foo1函数:

struct Key<T> {}
static readonly Key<double> MyKey = new Key<double>();
T? Foo1<T>(Key<T> key)
{
    return default;
}
Run Code Online (Sandbox Code Playgroud)

天真的读者会认为:

var foo1 = Foo1(MyKey);
Run Code Online (Sandbox Code Playgroud)

foo1类型为double?,结果表明编译器正在选择double返回类型。我需要显式添加一个约束来获取可为空的返回值:

T? Foo2<T>(Key<T> key) where T : struct // really return a nullable
{
    return default;
}
Run Code Online (Sandbox Code Playgroud)

?有人可以解释为什么我的第一个函数中没有选择可空引用的注释吗Foo1

c# generics nullable

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