使用std :: move(nullptr)的operator = of unique_ptr的C ++错误

时间:2014-05-22 08:28:18

标签: c++ unique-ptr

我看过this并且我已经更正了我的代码:

int solutionChooser = m_configFile.getChosenSolution();
ISolution* currentSolution;
switch (solutionChooser)
{
  case 1:
  {
    currentSolution = new Solution1());
    break;
  }
  case 2:
  {
    currentSolution = new Solution2());
    break;
  }
  case 3:
  {
    currentSolution = new Solution3());
    break;
  }
  case 4:
  {
    currentSolution = new Solution4());
    break;
  }
  default:
  {
    std::cout << "The specified solution does not exists\n";
    return;
  }
}

使用unique_ptr作为:

int solutionChooser = m_configFile.getChosenSolution();
std::unique_ptr<ISolution> currentSolution;
switch (solutionChooser)
{
  case 1:
  {
    currentSolution.reset(new Solution1());
    break;
  }
  case 2:
  {
    currentSolution.reset(new Solution2());
    break;
  }
  case 3:
  {
    currentSolution.reset(new Solution3());
    break;
  }
  case 4:
  {
    currentSolution.reset(new Solution4());
    break;
  }
  default:
  {
    currentSolution = std::move(nullptr); // here is the error
    std::cout << "The specified solution does not exists\n";
    return;
  }
}

现在我收到以下错误:

error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<ISolution>’ and ‘std::remove_reference<long int>::type {aka long int}’)

我有ISolution作为界面,SolutionX是从ISolution

派生的类

如何解决这个问题?我做错了什么?

3 个答案:

答案 0 :(得分:3)

std::unique_ptr已删除operator=,这就是您无法使用它的原因。

要重置std::unique_ptr,请使用reset()方法:

currentSolution.reset(nullptr);

但你不必这样做,因为无论如何初始值都是nullptr

答案 1 :(得分:3)

您的编译器错误,n3376 std::unique_ptr应该有重载

unique_ptr& operator=(nullptr_t) noexcept;

所以,你的代码应该可以正常工作。

答案 2 :(得分:0)

我无法添加评论,所以我只是发表关于答案的想法。 我相信你的问题是复制构造函数。 operator =没有使用unique_ptr定义,因此您必须使用移动构造函数。我不记得正确的语法,但它应该类似于:

/* Header file */
std::unique_ptr<ISolution> currentSolution;

/* CPP file */
std::unique_ptr<ISolution> currentSolution2(new ISolution);
currentSolution = std::move(currentSolution2);

这里可能存在一些错误,但希望它能让你走上正轨。如果你想要一个有效的例子,我在floobits上有一个,用户是Simple2012。 点击此处:https://floobits.com/Simple2012/Laboration_SearchMethods 检查arr.h和arr.cpp是否有一个具体的例子,但是我在那里使用的是一个数组而不是一个类,但是没有太大区别。