2016-09-29 2 views
0

Я написал функцию для вычисления объединения двух множеств.C++ - параметр 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&)' 

Вставка и найти работу, как предполагается, и я был в состоянии использовать вставку и найти функции в моей функции удалить, и некоторые другие, так почему я не могу использовать их здесь?

+1

Инициализировать 'StringUnion' следующим образом:' StringSet StringUnion (arrSize); ' – Leon

ответ

1

В вашей линии

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

РИТ использует C++ 14 construct that takes an std::size_t, and returns an std::unique_ptr<std::string> internally pointing to an array.

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

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

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

StringSet(int capacity); 

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

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

StringSet StringUnion(arrSize); 
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, компилятор жалуется.

+0

Итак, изменив мой оператор .h файла [], чтобы вернуть строку, это должно исправить ситуацию? Если это ссылка, то просто указание строкового значения должно быть в порядке. – TigerCode

+0

Да, это сработало. :) Спасибо! – TigerCode