Как исправить "нет совпадения для оператора +" в C ++? - PullRequest
0 голосов
/ 29 апреля 2019

Я пишу класс, который перегружает некоторые базовые операторы.Я написал другие классы, используя те же понятия и синтаксис, и они работают нормально, но теперь я получаю сообщение об ошибке, связанной с моей функцией оператор + специально для этого класса.Когда оператор «+» не написан в моей клиентской программе, все компилируется нормально, но когда я использую оператор «+» для инициализации данных объекта суммой данных в первых двух объектах, возникает ошибка.

Я видел часто задаваемые вопросы о перегрузке оператора и некоторые другие подобные вопросы на этом сайте, но ни один из них не помог мне.А именно потому, что ошибка, похоже, не возникает на другом компьютере.Я отправил код своему профессору, который был озадачен, поскольку он не мог воспроизвести ошибку, которую я получаю.

Мой код находится в трех отдельных файлах: mystring.h mystring.cpp и simpleclient.cpp.Я включу соответствующий код из каждого файла, так как остальная часть кода не имеет значения, но если вы хотите, чтобы я включил весь файл, я могу это сделать.

mystring.h:

#include <iostream>
#include <cstring>
#ifndef MYSTRING_H
#define MYSTRING_H
namespace cs_mystring{
    class MyString {
        public:
            MyString(const char* = "");
            MyString(const MyString& right);
            ~MyString();
            MyString operator=(const MyString& right);
            friend MyString operator+(const MyString& left, const MyString& right);
            //OTHER FUNCTION DECLARATIONS
        private:
            char* data;
    };
}
#endif

mystring.cpp:

#include <iostream>
#include <cstring>
#include <cassert>
#include "mystring.h"

namespace cs_mystring{
    //DEFAULT CONSTRUCTOR
    MyString::MyString(const char* init){
        data = new char[strlen(init) + 1];
        strcpy(data, init);
    }
    //COPY CONSTRUCTOR
    MyString::MyString(const MyString& right){
        data = new char[strlen(right.data) + 1];
        strcpy(data, right.data);
    }
    //DESTRUCTOR
    MyString::~MyString(){
        delete[] data;
    }
    //TODO
    MyString operator+(const MyString& left, const MyString& right){
        MyString temp;

        const int bufferSize = sizeof(left.data) + sizeof(right.data) + 2;
        char buffer[bufferSize];
        strcpy(buffer, left.data);
        strcat(buffer, right.data);
        temp = MyString(buffer);

        return temp;
    }
    //ASSIGNMENT OPERATOR
    MyString MyString::operator=(const MyString& right){
        if(this != &right){
            delete[] data; //remove the value stored in the heap
            data = new char[strlen(right.data) + 1]; //allocate memory for the new value
            strcpy(data, right.data); //copy the right-hand value into the new memory
        }
        return *this; //return the left hand object with the new value in the pointed-to memory location
    }

    //OTHER FUNCTION IMPLEMENTATIONS

}

simpleclient.cpp:

#include "mystring.h"
#include <fstream>
#include <cctype>      // for toupper()
#include <string>     
#include <cassert>
#include <iostream>
using namespace std;
using namespace cs_mystring;

int main(){

    //Simplest way to produce the error
    MyString a = MyString("Hello, ");
    MyString b = MyString("World!");
    MyString c = a + b;//Error is produced here
}

Идея состоит в том, что элемент данных для MyString c будет содержать «Hello, World!».

Я компилирую и выполняю программу с помощью следующих команд:

$ cd ~/Directory/with/the/files
$ g++ mystring.h mystring.cpp simpleclient.cpp -o exec
$ ./exec

Когда клиентская программа содержит ошибочный код, я получаю следующий вывод из терминала после второй команды:

$ g++ mystring.cpp simpleclient.cpp -o exec
simpleclient.cpp: In function ‘int main()’:
simpleclient.cpp:16:20: error: no match for ‘operator+’ (operand types are ‘cs_mystring::MyString’ and ‘cs_mystring::MyString’)
     MyString c = a + b;
                    ^
In file included from /usr/include/c++/5/bits/stl_algobase.h:67:0,
                 from /usr/include/c++/5/bits/char_traits.h:39,
                 from /usr/include/c++/5/ios:40,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from mystring.h:1:
/usr/include/c++/5/bits/stl_iterator.h:334:5: note: candidate: template<class _Iterator> std::reverse_iterator<_Iterator> std::operator+(typename std::reverse_iterator<_Iterator>::difference_type, const std::reverse_iterator<_Iterator>&)
     operator+(typename reverse_iterator<_Iterator>::difference_type __n,
     ^
/usr/include/c++/5/bits/stl_iterator.h:334:5: note:   template argument deduction/substitution failed:
simpleclient.cpp:16:22: note:   ‘cs_mystring::MyString’ is not derived from ‘const std::reverse_iterator<_Iterator>’
     MyString c = a + b;
                      ^
In file included from /usr/include/c++/5/string:52:0,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from mystring.h:1:
/usr/include/c++/5/bits/basic_string.h:4783:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::__cxx11::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)
     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^
/usr/include/c++/5/bits/basic_string.h:4783:5: note:   template argument deduction/substitution failed:
simpleclient.cpp:16:22: note:   ‘cs_mystring::MyString’ is not derived from ‘const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>’
     MyString c = a + b;
                      ^
In file included from /usr/include/c++/5/string:53:0,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from mystring.h:1:
/usr/include/c++/5/bits/basic_string.tcc:1151:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::__cxx11::basic_string<_CharT, _Traits, _Alloc> std::operator+(const _CharT*, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)
     operator+(const _CharT* __lhs,
     ^
/usr/include/c++/5/bits/basic_string.tcc:1151:5: note:   template argument deduction/substitution failed:
simpleclient.cpp:16:22: note:   mismatched types ‘const _CharT*’ and ‘cs_mystring::MyString’
     MyString c = a + b;
                      ^
In file included from /usr/include/c++/5/string:53:0,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from mystring.h:1:
/usr/include/c++/5/bits/basic_string.tcc:1167:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::__cxx11::basic_string<_CharT, _Traits, _Alloc> std::operator+(_CharT, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)
     operator+(_CharT __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs)
     ^
/usr/include/c++/5/bits/basic_string.tcc:1167:5: note:   template argument deduction/substitution failed:
simpleclient.cpp:16:22: note:   ‘cs_mystring::MyString’ is not derived from ‘const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>’
     MyString c = a + b;
                      ^
In file included from /usr/include/c++/5/string:52:0,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from mystring.h:1:
/usr/include/c++/5/bits/basic_string.h:4820:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::__cxx11::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)
     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^
/usr/include/c++/5/bits/basic_string.h:4820:5: note:   template argument deduction/substitution failed:
simpleclient.cpp:16:22: note:   ‘cs_mystring::MyString’ is not derived from ‘const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>’
     MyString c = a + b;
                      ^
In file included from /usr/include/c++/5/string:52:0,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from mystring.h:1:
/usr/include/c++/5/bits/basic_string.h:4836:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::__cxx11::basic_string<_CharT, _Traits, _Alloc> std::operator+(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, _CharT)
     operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, _CharT __rhs)
     ^
/usr/include/c++/5/bits/basic_string.h:4836:5: note:   template argument deduction/substitution failed:
simpleclient.cpp:16:22: note:   ‘cs_mystring::MyString’ is not derived from ‘const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>’
     MyString c = a + b;
                      ^

Если вы сможете объяснить, что означает эта ошибка и ее вывод и как ее исправить, это решит мою проблему.

1 Ответ

0 голосов
/ 29 апреля 2019

Эта проблема была решена путем компиляции файла .h в отдельной команде из файлов .cpp.

...