Błąd "no matching function for call to"

0

Mam problem z małym programem, w którym po
przeładowaniu operatora + wyskakuje błąd: "no matching function for call to" .
Oto kod:

#include <iostream>

using namespace std;

class K1
{
   string * p1;

public:
       K1():p1(new string()){};
       K1(string& wyraz):p1(new string())
       {
           *p1 = wyraz;

       }
       K1(const K1& kop)
       {

           *p1 = *kop.p1;

       }
       string operator[](size_t nr) const
       {
       return p1[nr];
       }
       K1 & operator=(const K1& ob)
       {
           if(this!=&ob)
           {
               *p1 = *ob.p1;
           }

           return *this;
       }
       friend ostream& operator<<(ostream & out, const K1& p);

};
ostream& operator<<(ostream & out, const K1& p)
{
    out << *p.p1;

    return out;
}

class K2
{
    K1 txt[2];
    int w1;

public:
    K2():w1(0){}
    K2(string wyraz_1, string wyraz_2, int w)
    {
    txt[0] = wyraz_1;
    txt[1] = wyraz_2;
    w1 = w;
    }
    K2(const K2& kop)
    {
        txt[0] = kop.txt[0];
        txt[1] = kop.txt[1];
        w1 = kop.w1;
    }
    K2 & operator=(const K2& ob)
    {
        if(this!=&ob)
        {
        txt[0] = ob.txt[0];
        txt[1] = ob.txt[1];
        w1 = ob.w1;

        }
        return *this;
    }

    friend K2 & operator+(const K2& ob, int liczba);
    friend ostream& operator<<(ostream & out, const K2& p);

};
K2 & operator+(const K2& ob, int liczba)
{
    return K2(ob.txt[0], ob.txt[1], ob.w1 + liczba);
}
ostream& operator<<(ostream & out, const K2& p)
{
    out << p.txt[0] << " " << p.txt[1] << " " << p.w1 << endl;

    return out;
}

int main()
{
    K2 ob1, ob2;
    const K2 * wsk1 = new K2("Ala ", "Koala ", 15);

    K2 ob3(*wsk1);

    delete wsk1;
    wsk1 = 0;

    const K2 * wsk2 = new K2(ob3);

    ob2 = *wsk2;
    cout << ob1 << *wsk2;

    delete wsk2;
    wsk2 = 0;

    cout << endl;

    cout << ob2;

    return 0;
}

Co trzeba zrobić z tym kodem, aby nie wyskakiwał błąd?
Proszę o podpowiedź.

2

Bardzo miło z twojej strony, że wywaliłeś całą istotną część komunikatu. https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

Po wrzuceniu kodu do kompilatora dostajemy od razu czytelny komunikat błędu (a nie enigmatyczne pół zdania):
https://wandbox.org/permlink/NosDEZE3dgdw49m2

prog.cc: In function 'K2& operator+(const K2&, int)':
prog.cc:82:51: error: no matching function for call to 'K2::K2(const K1&, const K1&, int)'
   82 |     return K2(ob.txt[0], ob.txt[1], ob.w1 + liczba);
      |                                                   ^
prog.cc:58:5: note: candidate: 'K2::K2(const K2&)'
   58 |     K2(const K2& kop)
      |     ^~
prog.cc:58:5: note:   candidate expects 1 argument, 3 provided
prog.cc:52:5: note: candidate: 'K2::K2(std::string, std::string, int)'
   52 |     K2(string wyraz_1, string wyraz_2, int w)
      |     ^~
prog.cc:52:15: note:   no known conversion for argument 1 from 'const K1' to 'std::string' {aka 'std::__cxx11::basic_string<char>'}
   52 |     K2(string wyraz_1, string wyraz_2, int w)
      |        ~~~~~~~^~~~~~~
prog.cc:51:5: note: candidate: 'K2::K2()'
   51 |     K2():w1(0){}
      |     ^~
prog.cc:51:5: note:   candidate expects 0 arguments, 3 provided

no matching function for call to 'K2::K2(const K1&, const K1&, int)' próbujesz utworzyć K2 za pomocą K1, K1 i int. K2 nie ma konstruktora przyjmującego takie typy parametrów, więc to musisz poprawić.

Przy okazji, zwracasz tam l-referencję do nowo utworzonego obiektu, to UB. https://dsp.krzaq.cc/post/304/jak-przeladowywac-operatory-w-mojej-klasie/

1
prog.cc:82:12: error: no matching constructor for initialization of 'K2'
    return K2(ob.txt[0], ob.txt[1], ob.w1 + liczba);
           ^  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ob.txt[0] reprezentuje typ K1, a konstruktor trójargumentowy dla K2 przyjmuje typ std::string


Nie wiem co robisz, ale sam sobie niepotrzebnie komplikujesz, życie. Te `new` i `delete` są ci zupełnie niepotrzebne. Przykładowo `new std::string` to już jest spory bezsens. polecam artykuł kolegi @kq: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

1 użytkowników online, w tym zalogowanych: 0, gości: 1