我写了一个函数来计算两组的并集。
我遇到了几个编译错误,我相信这部分是由于我如何创建StringUnion
数组并声明它但我到目前为止所做的一切都没有。
这是我的头文件。
#ifndef StringSet_header
#define StringSet_header
#include <memory>
#include <string>
using std::string;
using std::unique_ptr;
using std::make_unique;
class StringSet{
public:
//create an empty set
StringSet() = default;
StringSet(int capacity);
//copy a set
StringSet(const StringSet &);
StringSet& operator[](const int);
//Insert a string to the set
bool insert(string);
//Remove a string from the set
bool remove(string);
//Test whether a string is in the set
int find(string) const;
//Get the size of the set
int size() const;
//get string at position i
string get(int i) const;
//Return the set union of the set and another StringSet
StringSet setunion(const StringSet&) const;
//Return the intersection of the set and another StringSet
StringSet intersection(const StringSet&) const;
//Return the set diffference of the set and another StringSet
StringSet difference(const StringSet&) const;
//prevent default copy assignment
StringSet& operator=(const StringSet&) = delete;
int NOT_FOUND = -1;
static constexpr int def_capacity {4};
private:
int arrSize {def_capacity};
int currentSize {0};
unique_ptr<string[]> arr {make_unique<string[]>(def_capacity)};
};
#endif
这是我对SetUnion
函数的实现。
StringSet StringSet::setunion(const StringSet &Array2) const
{
StringSet StringUnion = make_unique<string[]>(arrSize);
if (currentSize > 0)
{
for (auto i=0; i < currentSize; i++)
{
auto s = arr[i];
StringUnion.insert(s);
}
for (auto i=0; i < Array2.currentSize; i++)
{
auto s = Array2[i];
if (StringUnion.find(s) == NOT_FOUND)
{
StringUnion.insert(s);
}
}
}
else
{
auto result = StringSet();
return result; //return empty StringSet}
}
}
错误:
|error: conversion from 'std::_MakeUniq<std::basic_string<char> []>::__array {aka std::unique_ptr<std::basic_string<char> []>}' to non-scalar type 'StringSet' requested|
error: passing 'const StringSet' as 'this' argument discards qualifiers [-fpermissive]
error: no matching function for call to 'StringSet::find(StringSet&)'
error: no matching function for call to 'StringSet::insert(StringSet&)'
按预期插入和查找工作,我可以在我的删除功能和其他一些内容中使用插入和查找功能,为什么我不能在这里使用它们?
答案 0 :(得分:1)
在你的行
StringSet
RHS使用c ++ 14 construct that takes an std::size_t
, and returns an std::unique_ptr<std::string>
internally pointing to an array。
然而,LHS是一个StringSet
对象。
你没有定义采用这种类型的构造函数,所以这是一个问题。
查看您的代码,std::unique_ptr<std::string>
确实有一个StringSet(int capacity);
成员,因此您可以添加一个ctor来获取此类对象,并从中初始化该成员。然而,目前还不清楚这样一个ctor的好处是什么,因为你已经拥有了一个ctor
StringSet StringUnion(arrSize);
已经基本上做了同样的事情。
正如Leon所写,你应该使用这一个而不是你拥有的那个
[amn]
答案 1 :(得分:1)
编译器提供的错误看起来非常清楚。我们来检查它们。
std::make_unique ...
转换为非标量类型StringSet
请求 这是因为函数std::make_unique
的定义,returns一个std::unique_ptr<T>
。但您尝试将其分配给StringSet
类型的值。没有用于从StringSet
创建std::unique_ptr
的构造函数或运算符,因此编译器抱怨他不能这样做。
'StringSet::find(StringSet&)'
您的班级StringSet
有operator[]
,可返回StringSet
的引用,因此auto s = Array2[i];
类型为StringSet
。但是,您的功能find
和insert
要求std::string
。由于没有构造函数可以提供从StringSet
到std::string
的隐式转换,编译器会抱怨。