binary operator overloading with class and constant in c++

Solution 1:

You need to add a constructor for Nyble(getData() + val); and Nyble(value + getData()) to work:

class Nyble {
public:
    explicit Nyble(char d);       // add this
    // ...
};

Nyble::Nyble(char d) : data(d) {} // and the implementation

Though, I recommend that you instead implement operator+ and operator- as free functions and make operator+= and operator-= member functions.

It could look like this:

class Nyble {
public:
    Nyble() = default;
    explicit Nyble(unsigned char d);
    
    // implement operator+= and operator-= as member functions
    Nyble& operator+=(const Nyble& n1);
    Nyble& operator-=(const Nyble& n1);

    unsigned char getData() const;
    unsigned char& getData();

private:
    unsigned char data = 0;
};

// operator+ and operator- as free functions:
Nyble operator+(Nyble lhs, const Nyble& rhs);
Nyble operator-(Nyble lhs, const Nyble& rhs);
Nyble::Nyble(unsigned char d) : data(d) {}

// the implementation of the member operator overloads:
Nyble& Nyble::operator+=(const Nyble& rhs) {
    data += rhs.data;
    return *this;
}
Nyble& Nyble::operator-=(const Nyble& rhs) {
    data -= rhs.data;
    return *this;
}

unsigned char Nyble::getData() const { return data; }
unsigned char& Nyble::getData() { return data; }

// now the free functions can use the member functions
// `operator+=` and `operator-=`:
Nyble operator+(Nyble lhs, const Nyble& rhs) {
    return lhs += rhs;
}

Nyble operator-(Nyble lhs, const Nyble& rhs) {
    return lhs += rhs;
}