list.push_back 和 std::shared_ptr 有问题

Having trouble with list.push_back and std::shared_ptr

这个小片段给我带来了一些麻烦。我只是不知道它有什么问题:

m_buttons.push_back(
  std::shared_ptr<std::pair<std::shared_ptr<ShinyButton>, BUTTONTYPE>>(
    std::make_pair(
      std::shared_ptr<ShinyButton>(new ShinyButton(0, 0, 0, 0, "menue_1", "menue_1_glow", 55, 55, 7, 7)),
      START
    )
  )
);

列表定义如下:

std::list<std::shared_ptr<std::pair<std::shared_ptr<ShinyButton>,BUTTONTYPE>>>

编译器给出的错误是:

No constructer matches Argument list.

您正在尝试用 std::make_pair 初始化 std::shared_ptr<std::pair<X, Y>>。这就像用 int 初始化 int *。也许你打算使用 make_shared:

m_buttons.push_back(
  std::make_shared<std::pair<std::shared_ptr<ShinyButton>, BUTTONTYPE>>(
    std::make_pair(
      std::shared_ptr<ShinyButton>(new ShinyButton(0, 0, 0, 0, "menue_1", "menue_1_glow", 55, 55, 7, 7)),
      START
    )
  )
);

事实上,使用 make_shared,您甚至不需要 make_pair 调用:

m_buttons.push_back(
  std::make_shared<std::pair<std::shared_ptr<ShinyButton>, BUTTONTYPE>>(
    std::shared_ptr<ShinyButton>(new ShinyButton(0, 0, 0, 0, "menue_1", "menue_1_glow", 55, 55, 7, 7)),
    START
  )
);

您传递的 return make_pairpair 而不是 pair*。您可以使用:

std::make_shared<std::pair<std::shared_ptr<ShinyButton>,BUTTONTYPE>>(
    std::make_pair(
        std::make_shared<ShinyButton>(0, 0, 0, 0, "menue_1", "menue_1_glow", 55, 55, 7, 7), START
    )
);