make_shared返回错误C2665:没有重载函数可以转换所有参数类型



c++入门的一个示例问题:添加名为get_file的成员,返回shared_ptrQueryResult对象中的文件

class QueryResult
{
friend std::ostream& print(std::ostream&, const QueryResult&);
public:
using line_no = std::vector<std::string>::size_type;
QueryResult(std::string s, std::shared_ptr<std::set<line_no>> p, std::shared_ptr<std::vector<std::string>> f) :sought(s), lines(p), file(f) {}
std::set<line_no>::iterator begin(std::string) const { return lines->begin(); };
std::set<line_no>::iterator end(std::string) const { return lines->end(); };
std::shared_ptr<std::vector<std::string>> get_file() const { return std::make_shared<std::vector<std::string>>(file); };
private:
std::string sought;
std::shared_ptr < std::set<line_no>> lines;
std::shared_ptr<std::vector<std::string>> file;
};

编译错误:

错误C2665:std:: vectorstd:字符串,std:: allocator::向量:没有重载函数可以转换所有实参类型。

您可以在std::make_shared文档中看到,为了创建std::shared_ptr<T>,您需要传递T的构造函数的参数。

然而在这一行中:

std::shared_ptr<std::vector<std::string>> get_file() const 
{ return std::make_shared<std::vector<std::string>>(file); };

您传递的file而不是构造std::vector<std::string>(你的T)的正确参数。

但是由于file已经是std::shared_ptr<std::vector<std::string>>,您可以简单地返回它(不需要make_shared):

std::shared_ptr<std::vector<std::string>> get_file() const 
{ return file; }

通过调用std::make_shared(),您调用std::vector<std::string>的构造函数,并将std::shared_ptr<std::vector<std::string>>作为输入。std::vector不是这样创建的(参见std::vector<T>的构造函数)。

正如@NathanOliver在评论中所说,只要返回成员file原样就足够了。

相关内容

  • 没有找到相关文章

最新更新