我看过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
如何解决这个问题?我做错了什么?
答案 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是否有一个具体的例子,但是我在那里使用的是一个数组而不是一个类,但是没有太大区别。