String Array Параметр для функции SetUnion

Я написал функцию для вычисления объединения двух множеств.

Я сталкиваюсь с несколькими ошибками компиляции, и я считаю, что это отчасти из-за того, как я сделал 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

Решение

В вашей линии

StringSet StringUnion = make_unique<string[]>(arrSize);

RHS использует C ++ 14 конструкция, которая принимает std::size_tи возвращает std::unique_ptr<std::string> внутренне указывая на массив.

LHS, однако, является StringSet объект.

Вы не определили конструктор, принимающий такой тип, так что это проблема.

Глядя на ваш код, StringSet есть std::unique_ptr<std::string> member, чтобы вы могли добавить ctor, берущий такой объект и инициализирующий член из него. Тем не менее, неясно, какая польза от такого ctor, так как у вас уже есть ctor

StringSet(int capacity);

который уже по сути делает то же самое.

Как пишет Леон, вы должны просто использовать это вместо строки, которая у вас есть

StringSet StringUnion(arrSize);
1

Другие решения

Ошибки, предоставляемые вашим компилятором, кажутся довольно очевидными. Давайте проверим их.

  • преобразование из std::make_unique ... к нескалярному типу StringSet запрошенный

Это из-за определения функции std::make_unique, который возвращается 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Компилятор жалуется.

1

По вопросам рекламы [email protected]