Проблема с const при перегрузке оператора

Вот кусок кода:

const String operator +(const String& s1,const String& s2) const;
}; //здесь кончается описание класса
const String String::operator +(const String& s1,const String& s2)const{}

На него выдаётся такая ошибка:

error: ‘const String String::operator+(const String&, const String&) const’ must take either zero or one argument

Мол оператор, член класса, может принимать только один аргумент. Убираем String::

const String operator +(const String& s1,const String& s2) const;
};
const String operator +(const String& s1,const String& s2)const{}

Выдаёт ошибку:

error: non-member function ‘const String operator+(const String&, const String&)’ cannot have cv-qualifier

Так как быть? И чтоб принимал два аргумента и чтоб константным был? Приём двух аргументов - чтобы можно было писать s = 'a' + s; т.е. когда определён конструктор от char и он стоит левым аргументом (оператор, принимающий один аргумент, может левым аргументом принимать только объект класса, а там у нас char - не работает, в общем, надо два аргумента) Константность, думаю, понятно для чего.

При всём при этом компилируется без проблем класс Matrix, где вроде всё так же написано, как и в классе String, который не компилится:

class Matrix
{
private:
    double data[5][5];
public:
    Matrix()
    {
        // Присваиваем всем элементам массива значение 0.0
        for (int row=0; row < 5; ++row)
            for (int col=0; col < 5; ++col)
                data[row][col] = 0.0;
    }

    double& operator()(int row, int col);
    const double& operator()(int row, int col) const; // для константных объектов
};

double& Matrix::operator()(int row, int col)
{
    //assert(col >= 0 && col < 5);
    //assert(row >= 0 && row < 5);

    return data[row][col];
}

const double& Matrix::operator()(int row, int col) const
{
    //assert(col >= 0 && col < 5);
    //assert(row >= 0 && row < 5);

    return data[row][col];
}

Вот мой класс полностью:

class String{
private:
  char* str;
  int size;

public:
  static int COUNT;
  static int DEF_LEN;
  String(const char* text, const int size): size(size) {
    ++COUNT;
    str = new char[size];
    for (size_t i = 0; i < size; i++) {
      str[i] = text[i];
    }
  }

  String(const char ch){

  }

  ~String(){
    delete[] str;
    --COUNT;
  }

  String(const String& s): size(s.size) {
    ++COUNT;
    str = new char[size];
    for (size_t i = 0; i < size; i++) {
      str[i] = s.str[i];
    }
  }

  static int const get_cnt() {return COUNT;}
  int const get_size() {return size;}

  void const print(){
    for (size_t i = 0; i < size; ++i) {
      cout << str[i];
    }
    cout << endl;
  }

  String& operator =(const String& s){
    if (this == &s) {return *this;}
    else{
      delete[] str;
      size = s.size;
      str = new char[size];
      for (size_t i = 0; i < size; ++i) {
        str[i] = s.str[i];
      }
    return *this;
    }
  }

  String& operator +=(const String& s){
    char* tmp = new char[size + s.size];
    for (size_t i = 0; i < size; ++i) {
      tmp[i] = str[i];
    }
    for (size_t i = 0; i < s.size; ++i) {
      tmp[size + i] = s.str[i];
    }
    delete[] str;
    size += s.size;
    str = tmp;
  }

  const String operator +(const String& s1,const String& s2) const;

};

int String::COUNT = 0;
int String::DEF_LEN = 250;

const String String::operator +(const String& s1,const String& s2)const{
  String s = s1;
  s+=s2;
  return s;
}


Ответы (0 шт):