'Get std::set comparison as function parameter / complemet of a set without universal set

I have this .cpp file and I have to write the methods set_union, subset, complement, and contains. My two problem is first: How can I have a complement without a universal set and how will ("Hi","Hello","Aloha","Ciao") sets complement give "C++" as a member.

Second with the set a and x it gives me an error :

no instance of constructor "set_operations<T>::set_operations [with T=std::string]" matches the argument list -- argument types are: (std::set<std::string, string_size_less, std::allocator<std::string>>)

and

no suitable user-defined conversion from "std::set<std::string, std::greater< std::string>, std::allocator< std::string>>" to "std::set<std::string, std::less< std::string>, std::allocator< std::string>>" exists

How can I get the sets comparison as function parameter?

main.cpp:

#include <iostream>
#include "setops.h"
#include <set>
#include "setops.h"
#include <algorithm>
#include <iterator>
#include <string>
#include <numeric>

struct string_size_less
{

  bool operator()(const std::string &a,
                  const std::string &b)
  {
    return a.size() < b.size();
  }
};

const int max = 1000;

bool check()
{
  std::set<int> si;
  for (int i = 0; i < max; ++i)
  {
    si.insert(i);
  }

  std::set<std::string> msgs;
  msgs.insert("Hi");
  msgs.insert("Hello");
  msgs.insert("Ciao");
  msgs.insert("Aloha");

  set_operations<std::string> ops(msgs);
  const set_operations<std::string> cops(msgs);

  set_operations<int> opi(si);

  for (int i = 0; i < max; ++i)
  {
    opi.complement();
  }
  ops.complement();

  if (!cops.contains("Hi") || !opi.contains(max / 2) ||
      ops.contains("Ciao") || ops.contains("Aloha") ||
      opi.contains(2 * max) || cops.contains("?") ||
      cops.contains("NullPointerException") || !ops.contains("C++"))
  {
    return false;
  }

  std::set<std::string> w;
  w.insert(":-)");
  w.insert(":-P");
  w.insert("Ciao");
  ops.set_union(w);

  std::set<int> nums;
  nums.insert(max / 2);
  nums.insert(max / 3);
  nums.insert(max);

  opi.complement();
  opi.set_union(nums);
  opi.complement();

  if (opi.contains(max / 2) || !opi.contains(max / 4) ||
      !ops.subset(w) || cops.subset(w) ||
      ops.contains("Hi") || !ops.contains("Ciao") ||
      !ops.contains(":-P") || cops.contains(":-P"))
  {
    ops.complement();
    return false;
  }

  std::set<std::string, string_size_less> x;
  x.insert("Hello");
  x.insert("Ciao");

  std::set<std::string, std::greater<std::string>> a;
  a.insert(":-o");

  set_operations<std::string> m(x);
  m.set_union(a);

  return (!m.contains(":-/") && !m.subset(msgs));
}

int main()
{
  std::cout
      << "Your solution is "
      << (check() ? "" : "not ")
      << "ready for submission."
      << std::endl;
}

setops.h:

#ifndef SET
#define SET

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
#include <set>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <iterator>
#include <string>
#include <numeric>
class Comp
{
    bool comp;
};
template <typename T>
class set_operations
{
private:
    std::set<T> data; // data

public:
    set_operations::set_operations(const std::set<T> &s) : data(s.begin(), s.end()) {}
    void complement();
    bool contains(T search) const;
    void set_union(std::set<T> set2);
    bool subset(std::set<T> set2) const;
    void write();

    set_operations &operator+=(const std::set<T> &set)
    {
        typename std::set<T>::iterator itr = set.begin();
        for (; itr != set.end(); ++itr)
        {
            this->data.insert(*itr);
        };
        return *this;
    }
};

template <typename T>
bool set_operations<T>::contains(T search) const
{
    bool ret = false;
    typename std::set<T>::iterator itr = data.begin();
    for (; itr != data.end(); ++itr)
    {
        if (*itr == search)
        {
            ret = true;
        }
    }
    return ret;
}
template <typename T>
void set_operations<T>::set_union(std::set<T> set2)
{
    typename std::set<T>::iterator itr = set2.begin();
    for (; itr != set2.end(); ++itr)
    {
        data.insert(*itr);
    }
}

template <typename T>
bool set_operations<T>::subset(std::set<T> set2) const
{
    set_operations<T> test(data);
    bool ret = true;
    typename std::set<T>::iterator itr = set2.begin();
    for (; itr != set2.end(); ++itr)
    {
        if (!test.contains(*itr))
        {
            ret = false;
        }
    }
    return ret;
}

template <typename T>
void set_operations<T>::write()
{
    typename std::set<T>::iterator itr = data.begin();
    for (; itr != data.end(); ++itr)
    {
        std::cout << *itr << std::endl;
    }
};
#endif


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source