小编use*_*267的帖子

私有/删除拷贝构造函数的std :: unordered_map :: emplace问题

使用gcc 4.7.2(mingw)编译以下代码

#include <unordered_map>
#include <tuple>

struct test
{
        test() =default;
    private:
        test(test const&) =delete;
};

int main()
{
    std::unordered_map<char, test> map;

    map.emplace(
        std::piecewise_construct,
        std::forward_as_tuple('a'),
        std::forward_as_tuple()
    );
}
Run Code Online (Sandbox Code Playgroud)

如果我改变了拷贝构造函数testtest(test const&) =delete;test(test const&) =default;然而,模板错误呕吐,似乎抱怨const test&不被转换为test(文字在这里).不应该工作吗?或者如果没有,他们是否应该给出错误?

c++ gcc unordered-map mingw c++11

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

c ++,cout和UTF-8

希望一个简单的问题:cout处理以多字节UTF-8字符结尾的字符串时似乎死了,我做错了吗?这是在Win7 x64上使用GCC(Mingw).

**编辑抱歉,如果我不够清楚,我不关心丢失的字形或如何解释字节,只是在调用cout << s4(缺少BAR)后它们没有显示.cout在第一次显示之后的任何进一步的s没有任何文字!

#include <cstdio>
#include <iostream>
#include <string>

int main() {
    std::string s1("abc");
    std::string s2("…");  // … = 0xE2 80 A6
    std::string s3("…abc");
    std::string s4("abc…");

    //In C
    fwrite(s1.c_str(), s1.size(), 1, stdout);
    printf(" FOO ");
    fwrite(s2.c_str(), s2.size(), 1, stdout);
    printf(" BAR ");
    fwrite(s3.c_str(), s3.size(), 1, stdout);
    printf(" FOO ");
    fwrite(s4.c_str(), s4.size(), 1, stdout);
    printf(" BAR\n\n"); 

    //C++
    std::cout << s1 << " FOO " << s2 << " BAR " << s3 << …
Run Code Online (Sandbox Code Playgroud)

c++ cout utf-8

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

gdb没有捕获vector引发的std :: out_of_range

使用MinGW 4.6.2(使用g ++ -g -std = c ++ 0x)编译以下内容,std::out_of_range如果我尝试,gdb似乎不想捕获catch throw.如果我throw手动它抓得很好,我做错了什么?

#include <stdexcept>
#include <vector>

int main()
{
    std::vector<char> vec(10);
    try {       
        vec.at(10); // this won't be caught by gdb

        // throw std::out_of_range(""); // this will
    }
    catch (std::out_of_range const& e) {        
    }   
}
Run Code Online (Sandbox Code Playgroud)

c++ gdb mingw

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

边界检查const函数内的成员std :: array的问题

我正在使用以下代码检查带有mingw(gcc 4.7.0)的成员std :: array的奇怪行为边界

#include <iostream>
#include <array>

class testClass
{
    std::array<int, 2> testArray;

    public:
        testClass();
        void func() const;

};

testClass::testClass() : testArray({{1, 2}})
{
}

void testClass::func() const
{
    for (int i = 0; i < 2; ++i)
        std::cout << testArray.at(i) << '\n' << testArray[i] << '\n';       
}


int main()
{
    testClass test;
    test.func();
}
Run Code Online (Sandbox Code Playgroud)

输出是

0
1
0
2
Run Code Online (Sandbox Code Playgroud)

这个错误似乎与优化有关,因为它只在编译时出现-O,我尝试了启用的各个标志,-O但无法进一步缩小范围.使函数非const也可以解决问题.这可能是一个错误还是我错过了什么?

*编辑

缩小它,看起来像const版本中的一个错误.at()

#include <iostream>
#include <array>

int main()
{
    std::array<int, 2> …
Run Code Online (Sandbox Code Playgroud)

c++ mingw c++11

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

为什么这个代码被认为是re​​etrant以及当操作系统中断线程时究竟发生了什么?

以下是IBM所说的可重入代码片段:

/* reentrant function (a better solution) */
char *strtoupper_r(char *in_str, char *out_str)
{
  int index;

  for (index = 0; in_str[index]; index++)
    out_str[index] = toupper(in_str[index]);

  out_str[index] = 0

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

对我来说,这段代码不可重入,因为循环计数器的索引是在本地定义的.如果操作系统在循环中中断此线程,并且另一个线程调用此函数,则索引将丢失.我错过了什么?为什么这段代码被认为是可重入的?

操作系统在中断线程时是否将局部变量(如索引)的副本保存到线程的堆栈中,然后在处理继续时重新建立变量?

它似乎使这个函数可重入索引必须是接口的一部分作为调用者提供的存储.

c++ winapi multithreading reentrancy

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

EnumChildWindows和lambda

当我尝试在MinGW 4.6.2上编译以下内容时

EnumChildWindows(hwnd, [](HWND, LPARAM) -> BOOL { return TRUE; }, 0);
Run Code Online (Sandbox Code Playgroud)

我明白了

error: cannot convert '<lambda(HWND, LPARAM)>'
to 'ENUMWINDOWSPROC {aka int (*)(HWND__*,long int)}'
for argument '2' to 'BOOL EnumChildWindows(HWND, ENUMWINDOWSPROC, LPARAM)'
Run Code Online (Sandbox Code Playgroud)

我是否错误地宣布了lambda,或者这根本不起作用?回调的MS定义是

BOOL CALLBACK EnumChildProc(
  __in  HWND hwnd,
  __in  LPARAM lParam
);
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633493%28v=vs.85%29.aspx

调用约定会导致问题吗?

c++ winapi mingw c++11

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

ifstream 未打开文件

在此函数中,我试图打开一个文件,其中包含一组我想分配给矩阵数组的字符,但是每当我运行此程序时,控制台都会显示一条错误,指出该文件未打开。另一个问题,如果我将该文件添加到我的资源文件夹中,我如何指定访问该文件而不是硬盘驱动器根目录中的文件?

ifstream readSecondMap("C:\\map_2.txt", ifstream::in);

void Stage::populateStage(ifstream &myStage, char (&myArray)[mapXcor][mapYcor]) {
    if(myStage.is_open()){
        for(int a = 0; a < mapXcor+1; ++a){
            for(int b = 0; b < mapYcor+1; ++b){
                myArray[a][b] = (char) myStage.get();
            }
        }
        myStage.close();        
    } else {
        std::cout << "Error: Unable to open File" <<std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ ifstream

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

仅订单先决条件的多个隐式规则

我正在尝试制作一个仅订单的先决条件,以确保在输出文件之前存在构建目录.根据GNU Make手册:

您仍然可以为同一目标声明多行先决条件:它们会相应地附加(正常的先决条件会附加到正常先决条件列表中;仅限订单的先决条件会附加到仅限订单的先决条件列表中).

所以我希望这应该有效:

BUILDDIR:=build

all: $(BUILDDIR)/test.o
clean:
    rm -rf $(BUILDDIR)

$(BUILDDIR):
    mkdir -p $(@)

$(BUILDDIR)/%.o: | $(BUILDDIR)
$(BUILDDIR)/%.o: %.c
    gcc -o $@ -c $<
Run Code Online (Sandbox Code Playgroud)

但它没有,无法创建目录.但是,当我将规则放在一行时,它确实有效:

$(BUILDDIR)/%.o: %.c | $(BUILDDIR)
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,它并不重要,但我需要为我更复杂的makefile创建这样的多个先决条件列表,并且手册使它听起来应该有效.我怎么能做到这一点?

如果重要:

$ make -v
GNU Make 3.81
Run Code Online (Sandbox Code Playgroud)

makefile gnu-make

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

什么是memcpy和C中的等号之间的效率差异?

我经常使用memcpy来复制C/C++中的结构.我看到有人使用等号在C/C++中直接复制struct.例如:

struct A { char* name; int value; };
struct B { struct A happy[10]; }; 

struct A a1, a2;
struct B b1, b2;
memcpy(&a1, &a2, sizeof(struct A));
b1 = b2;
Run Code Online (Sandbox Code Playgroud)

memcpy和等号之间的效率差异是什么?

c memcpy

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

C++在循环中使用switch时的输出相同

我已经尝试使以下测试程序工作2天,但它不起作用.它基于几个头文件完全正常工作,因为我通过另一个测试程序检查它们.它有头文件,称为Area,Circle,Ring,Rectangle和Square.我还定义了函数randcolor和randsize; 我一遍又一遍地检查每一个,但它在while循环中第二次尝试后产生相同的ouptut:

int main()
{
  srand(time(NULL));
  Area *list[20];
  int m;
  Area *c;
  int j = 0;

  while (j < 20) {

    m = rand() % 4;
    cout << m << endl;

    switch (m) {
      case 0: {
        Circle a(randcolor(), randsize());
        c = &a;
        break; 
      }
      case 1: {
        Ring r(randcolor(), randsize(), randsize());
        c = &r;
        break;
      }
      case 2: {
        Rectangle re(randcolor(), randsize(), randsize());
        c = &re;
        break;
      }
      case 3: {
        Square sq(randcolor(), randsize());
        c = &sq;
        break;
      } …
Run Code Online (Sandbox Code Playgroud)

c++

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

Bash中的Diff命令

每次我运行以下bash命令时,都会出现错误:

这是代码:

sort -b ./tests/out/$scenario > $studentFile
sort -b ./tests/out/$scenario > $profFile
$(diff $studentFile $profFile)
  if [ $? -eq 0 ]
      then 
          echo "Files are equal!"
      else
          echo "Files are different!"
      fi
Run Code Online (Sandbox Code Playgroud)

这是错误:

./test.sh: 2c2: not found
Run Code Online (Sandbox Code Playgroud)

我基本上想对两个文件进行排序,然后检查它们是否相等。我不明白的是此错误的含义以及如何消除它。任何帮助将不胜感激。

谢谢!

bash diff

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

标签 统计

c++ ×8

mingw ×4

c++11 ×3

winapi ×2

bash ×1

c ×1

cout ×1

diff ×1

gcc ×1

gdb ×1

gnu-make ×1

ifstream ×1

makefile ×1

memcpy ×1

multithreading ×1

reentrancy ×1

unordered-map ×1

utf-8 ×1