如何在派生类的向量中push_back unique_ptr



我有一个复制linux shell命令(ls,mkdir等(的任务,所以我使用的是通用的树结构。基本上,目录类具有指向基类(文件(或其他派生类(目录(的指针向量。每当我尝试push_back指向新目录的唯一指针时,都会收到以下错误。

/usr/include/c++/8/ext/new_allocator.h:136:4: error: no matching function 
for call to ‘std::unique_ptr<FileData*>::unique_ptr(std::unique_ptr<Directory,
std::default_delete<Directory> >)’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这是我的代码

#include "FileData.h"
#include <vector>
#include <cctype>
#include <memory>
class Directory : public FileData
{
private:
Directory * parent;
std::vector<std::unique_ptr<FileData*>> files;
void eraseString(std::string & mainString, 
const std::string & stringToErase);
int amountOfChar(const std::string & check);
public:
Directory();
Directory(Directory * par);
~Directory();
Directory(const Directory & x);
void listComputerFiles(std::string input);
void changeDirectory(std::string input);
void makeDirectory(std::string input);
void removeDirectory(std::string input);
void makeFile(std::string input);
void removeFile(std::string input);
void printCurrentDirectory();
};
class FileData
{
friend class Directory;
protected:
std::string name;
std::string restrictions;
std::string timestamp;
std::string owner;
std::string group;
int dataSize;
int numberOfItems;
public:
FileData();
FileData(std::string nameOfFile, std::string restrict, std::string time, 
std::string own, int size, int itemNumber);
virtual ~FileData();
};

这是错误发生的地方

files.emplace_back(std::make_unique<Directory>(new Directory(*this)));

我尝试了许多其他具有类似问题的用户的不同组合,但无济于事,包括使用shared_ptr。正如您可能知道的那样,我没有使用智能指针的经验,但是由于具有嵌套目录来清理,因此觉得在这种情况下使用它们很有帮助,这令人生畏。

unique_ptr<T>T*原始指针的包装器。

当你写unique_ptr<FileData*>时,它使FileData**作为内部指针。这不是你想要的。

只需写:

std::vector<std::unique_ptr<FileData>> files;

当你使用emplace家族函数时,你应该传递参数,这些参数将用于构造unique_ptr实例:

files.emplace_back( new Directory(*this) );

files.emplace_back( new Directory() );

push_back方法需要完全构造的unique_ptr对象:

files.push_back(std::make_unique<Directory>(new Directory(*this)));

相关内容

  • 没有找到相关文章

最新更新