Ошибка e0289 c

Source.cpp

#include <iostream>
#include "String.h"
using namespace std;

int main(){
cout << "Hello World!n";

String str("HELLO");

cout << str;

return 0;
}

String.h

#pragma once
#include <iostream>

class String
{
private:
    char* str;
    int length;
public:
    String();
    String(char* str);
    String(const String& other);
    String(String&& other) noexcept;
    ~String();
    String& operator= (const String& other);
    String& operator+ (const String& other);
    char& operator[] (size_t i) const;
    friend bool operator== (const String& str, const String& other);
    friend bool operator!= (const String& str, const String& other);
    friend ostream& operator<<(ostream& out, const String& other)
    {
        return (out << other.str);
    }
    friend istream& operator>>(ostream& in, const String& other)
    {
        return (in >> other.str);
    }
    size_t Length();
    void show();
};

String.cpp

#include "String.h"
#include <iostream>
using namespace std;

String::String()
{
    str = nullptr;
    length = 0;
}

String::String(char* str)
{
    length = strlen(str);
    this->str = new char[length + 1];
    for (int i = 0; i < length; i++)
        this->str[i] = str[i];

    this->str[length] = '';
}

String::String(const String& other)
{
    if (str != nullptr)
        delete[] str;
    length = strlen(other.str);
    str = new char[length + 1];
    for (int i = 0; i < length; i++)
        str[i] = other.str[i];

    str[length] = '';
}

String::String(String&& other) noexcept
{
    length = other.length;
    str = other.str;
    other.str = nullptr;
}

String::~String()
{
    delete[] str;
}

void String::show()
{
    cout << str;
}

size_t String::Length() 
{
    return length;
}

bool operator== (const String& str, const String& other)
{
    if (str.length != other.length)
    {
        return false;
    }
    for (int i = 0; i < str.length; i++)
    {
        if (str[i] != other.str[i])
            return false;
    }

    return true;
}

bool operator!= (const String& str, const String& other)
{
    return !(operator==(str, other));
}

char& String::operator[] (size_t i) const
{
    return str[i];
}

String& String::operator= (const String& other)
{
    if (this->str != nullptr)
        delete[] str;
    length = strlen(other.str);
    this->str = new char[length + 1];
    for (int i = 0; i < length; i++)
        this->str[i] = other.str[i];

    this->str[length] = '';

    return *this;
}
String& String::operator+ (const String& other)
{
    String newStr;
    length = strlen(str) + strlen(other.str);
    newStr.str = new char[length + 1];

    int i = 0;
    for (i; i < strlen(str); i++)
        newStr.str[i] = str[i];
    for (int j = 0; j < strlen(other.str); i++, j++)
        newStr.str[i] = other.str[j];

    newStr[length] = '';

    return newStr;
}

Скрины с описанием ошибки:

1
1
2
2

задан 27 ноя 2019 в 19:38

lunary's user avatar

9

Вот здесь

String str("HELLO");

"HELLO" приводится к типу const char *. А конструктора такого у вас нет!

Но вот скажите — в конструкторе

String::String(char* str)
{
    length = strlen(str);
    this->str = new char[length + 1];
    for (int i = 0; i < length; i++)
        this->str[i] = str[i];

    this->str[length] = '';
}

вы разве меняете строку, на которую указывает аргумент str? Тогда по какой причине вы объявляете его как char* str, а не как const char* str, каковым он и является? объявите его как

String::String(const char* str)

Сразу станет легче жить :) Не экономьте на const!

Вот, например:

size_t String::Length() 
{
    return length;
}

Скажите, эта функция-член меняет объект String? Нет? Так почему вы не объявите ее как константную?

size_t String::Length() const
{
    return length;
}

ответ дан 27 ноя 2019 в 19:44

Harry's user avatar

HarryHarry

215k15 золотых знаков117 серебряных знаков228 бронзовых знаков

4

Строковый литерал "HELLO" в языке C++ имеет тип const char [6]. Он также может быть неявно преобразован к типу const char *.

У вашего класса нет конструкторов, способных принимать аргументы типа const char [6] или const char *. Об этом вам и говорит компилятор.

ответ дан 27 ноя 2019 в 19:45

AnT stands with Russia's user avatar

Студворк — интернет-сервис помощи студентам

Из книги: https://www.rulit.me/books/c-b… 8-200.html
Ошибка (активно) E0289 отсутствуют экземпляры конструктора «myclass<Type1, Type2>::myclass [с Type1=char, Type2=char *]», соответствующие списку аргументов

// Здесь используется два обобщенных типа данных в определении класса.
#

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
include <iostream>
using namespace std;
 
template <class Type1, class Type2>
class myclass {
    Type1 i;
    Type2 j;
public:
    myclass(Type1 a, Type2 b) { i = a; j = b; }
    void show() { cout << i << ' ' << j << 'n'; }
};
 
int main()
{
    setlocale(LC_ALL, "rus");
    myclass<int, double> ob1(10, 0.23);
    myclass<char, char *> ob2('x', "Это тест");
    ob1.show(); // отображение int- и double-значений
    ob2.show(); // отображение значений типа char и char *
    system("pause");
    return 0;
}

You have not defined a constructor for your Movie class that takes those values as parameters.

If you’re trying to just initialize the object by members, use {} instead of ():

Movie movie1 = Movie{"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};

or just

Movie movie1 = {"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};

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

ССЫЛКИ:
E0289: нет экземпляра конструктора «Phone :: Phone» соответствует списку аргументов?
ни один экземпляр конструктора не соответствует списку аргументов
Ошибка: ни один экземпляр конструктора не соответствует списку аргументов

Вот мой код:

#include <iostream>
#include <cmath>
#include <string>
#include <iomanip>
#include "trimdecimal.h"

using namespace std;

class Movie {
    public:
        string title;
        string director;
        string mainCast1;
        string mainCast2;
        int yearReleased;
        bool isAHit;
        int publicLikePercentage;
};

int main()
{
    Movie movie1 = Movie("Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89);
}

И я получаю эту ошибку, как я сказал в заголовке:

E0289     no instance of constructor "Movie::Movie" matches the argument list

Я написал это в Visual Studio 2019

Какие-нибудь решения? Я буду искренне признателен за любые исправления, но, пожалуйста, будьте конкретны и объясните мне, как решить эту проблему, как если бы вы поступили с ребенком.

1 ответ

Лучший ответ

Вы не определили конструктор для вашего класса Movie, который принимает эти значения в качестве параметров.

Если вы пытаетесь просто инициализировать объект по членам, используйте {} вместо ():

Movie movie1 = Movie{"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};

Или просто

Movie movie1 = {"Fast & Furious Presents: Hobbs & Shaw", "David Leitch", "Dwayne Johnson", "Jason Statham", 2019, true, 89};


0

jkb
12 Дек 2019 в 01:04

#include <iostream>
#include <string_view>
#include <string>
std::string_view LoL()
{
    std::string str{};
    std::getline(std::cin >> std::ws, str);
    return str;
}
int main()
{
    std::string_view x{LoL};
    std::cout << x;
    return 0;
}

не компилируется пишет

Ошибка (активно) E0289 отсутствуют экземпляры конструктора «std::basic_string_view<_Elem, _Traits>::basic_string_view [с _Elem=char, _Traits=std::char_traits]», соответствующие списку аргументов getline E:c++getlineSource.cpp 12

что делать

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

В строке

std::string_view x{LoL};

вы передаете в качестве аргумента адрес функции LoL, а не результат ее вызова.

std::string_view x{LoL()};

Просто интересно, сколько секунд вы пытались решить этот вопрос самостоятельно?

И еще —

std::string_view LoL()
{
    static std::string str{};

или

std::string LoL()
{
    std::string str{};
    std::getline(std::cin >> std::ws, str);
    return str;
}

int main()
{
    std::string lol = LoL();
    std::string_view x{lol};
    std::cout << x;
    return 0;
}

→ Ссылка

Понравилась статья? Поделить с друзьями:
  • Ошибка e0276 c
  • Ошибка e0209 autodata как исправить
  • Ошибка e02 экскаватор komatsu
  • Ошибка e02 стиральная машина haier
  • Ошибка e02 стиральная машина candy что означает ошибка