Dlaczego nie działa w Code Blocksie, a w Visualu już tak?

0

Cześć, próbuję przeciążyć operatory +, - i * tak by działały operując na obiektach.
Zrobiłem póki co dwa z nich: + i =. Operator = działa prawidłowo, natomiast mam problem z wywołaniem instrukcji A = B+C. O ile na instrukcji A=B wszystko jest ok, o tyle na A=B+C wyrzuca mi błąd:

no match for 'operator=' (operand types are 'CTable' and 'CTable') 
candidate is 
CTable& CTable::operator=(CTable&)| 
no known conversion for argument 1 from 'CTable' to 'CTable&'|

Chciałbym dodać, iż takie działanie zaobserwowane jest w próbie odpalenia kodu w Code Blocksie, w Visualu wszystko kompiluje się i działa bez zająknięcia. Wie ktoś może jak rozwiązać ten błąd? Ściągnąć jakąś nowszą wersję kompilatora? Jeśli tak to jaką?

kod:

CTable& CTable::operator=(CTable &b)
{
    if (lengthArray != b.lengthArray)
    {
        changeLengthArray(b.lengthArray);
    }
    for (int i=0; i< lengthArray; i++)
        {
            pointer[i] = b.pointer[i];
        }
    s_name = b.s_name;
    return *this;
}

CTable CTable::operator+(CTable &c)
{
    CTable a = *this;

    a.vSetName(a.getS_Name() + "+" + c.getS_Name());
    int i = a.getLengthArray();
    a.changeLengthArray(a.getLengthArray()+c.getLengthArray());
    for (int j=0; j<c.getLengthArray(); j++)
    {
        a.setValueToArray(i, c.getPointer(j));
        i++;
    }
    return c;
} 
4
CTable& CTable::operator=(CTable &b)

Jeśli operator+ zwraca wartość (tak jak idiomatycznie powinien) to nie można jej przypisać do lvalue referencji. Przyjmuj przez const ref.

Dlaczego działa na visualu? Ponieważ jest to nie do końca kompilator c++ - czasem kompiluje niepoprawny kod, a poprawnego nie.

0

Zmieniłem tak, jak poradziłeś:

CTable CTable::operator+(const CTable &c)
{
    CTable a = *this;

    a.s_name += "a" + c.s_name;
    //a.vSetName(a.getS_Name() + "+" + c.getS_Name());
    int i = a.lengthArray;
    a.changeLengthArray(a.lengthArray+c.lengthArray);
    for (int j=0; j<c.lengthArray; j++)
    {
        a.pointer[i] = c.pointer[j];
        //a.setValueToArray(i, c.getPointer(j));
        i++;
    }
    return c;
} 

i rzeczywiście to przeszło, natomiast problem teraz pojawił się przez to gdzieś indziej:

 \ no matching function for call to 'CTable::CTable(const CTable&)'|
\ candidates are:|
\CTable::CTable(CTable&)|
\no known conversion for argument 1 from 'const CTable' to 'CTable&'|

Jak to teraz naprawić?

2

Tak samo. Konstruktor kopiujący nie powinien przyjmować lvalue referencji.

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