Hej
Pytanie typowo z rozmowy kwalifikacyjnej. Jak stworzyć poniżej parę by nie wywalał się błąd kompilacji "no matching function for call..."?
#include <stdio.h>
#include <iostream>
#include <string>
#include <map>
#include <utility>
using namespace std;
class Klasa
{
public:
Klasa():x(nullptr)
{
std::cout << "default ctor" << std::endl;
}
Klasa(int* x):x(x)
{
std::cout << "ctor x=" << x << std::endl;
}
~Klasa()
{
std::cout << "dtor x=" << x << std::endl;
delete x;
}
Klasa(Klasa&& kl)
{
std::cout << "move ctor" << std::endl;
delete x;
x=kl.x;
kl.x=nullptr;
}
Klasa(const Klasa& kl)
{
std::cout << "copy ctor" << std::endl;
*x=*kl.x;
}
Klasa& operator=(Klasa&& kl)
{
std::cout << "move assignment operator" << std::endl;
delete x;
x=kl.x;
kl.x=nullptr;
return *this;
}
Klasa& operator=(const Klasa& kl)
{
std::cout << "copy assignment operator" << std::endl;
*x = *kl.x;
return *this;
}
void print() const
{
std::cout << x << std::endl;
}
int get() const
{
if(x!=nullptr)
return *x;
return 0;
}
private:
int* x;
};
int main()
{
pair<Klasa, string> para = pair<Klasa, string>(Klasa(new int(2)), "cccc"); //to sie nie kompiluje
map<Klasa, string, bool (*)(const Klasa&, const Klasa&)>
mapa([](const Klasa& left, const Klasa& right){return left.get()<right.get();});
mapa.insert(make_pair(new int(2), "ddd")); //to niby sie kompiluje ale double free or corruption wyskakuje przy egzekucji
return 0;
}