我有一个复制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)));