Как исправить "не может конвертировать"? - PullRequest
0 голосов
/ 14 марта 2020

Я получил ошибки компиляции "cannot convert..", `" нет экземпляра конструктора .. ". Я не могу понять, что я сделал не так. Я пытался изменить способ инициализации объекта, но это не помогло. Хотите лучше это понять.

  • Ошибка C2440 '': невозможно преобразовать из 'const char [11]' в 'Course'

  • Ошибка C2512 'LectureTitle :: LectureTitle': не доступен соответствующий конструктор по умолчанию

  • Ошибка (активная) E0289 нет экземпляра конструктора "Course :: Course", совпадающего со списком аргументов

  • Ошибка (активная) E0312 нет подходящего пользовательского преобразования из «Недели» в «LectureTitle»

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    struct Specialization {
        string data;
        explicit Specialization(string& new_value) {
            data = new_value;
        }
    };
    struct Course {
        string data;
        explicit Course(string& new_value) {
            data = new_value;
        }
    };
    struct Week {
        string data;
        explicit Week(string& new_value) {
            data = new_value;
        }
    };
    struct LectureTitle {
        string specialization;
        string course;
        string week;
        LectureTitle(Specialization& new_value1, Course& new_value2, Week new_value3) {
            specialization = new_value1.data;
            course = new_value2.data;
            week = new_value3.data;
        }
    };

    int main() {
        LectureTitle title (
            Specialization("C++"),
            Course("White belt"),
            Week("4th")
        );

    }

1 Ответ

1 голос
/ 15 марта 2020
LectureTitle title (
        Specialization("C++"),
        Course("White belt"),
        Week("4th")
    );

Здесь вы пытаетесь создать экземпляр LectureTitle с временными значениями ( rvalues ​​) Specialization, Course и Week. Они являются временными, потому что они не являются именованными переменными, то есть не определены как переменные перед этим фрагментом кода.

Однако все ваши конструкторы принимают ссылки на именованные переменные ( lvalues ​​). Вот почему вы получаете ошибки компилятора. Чтобы исправить эти ошибки, вы можете заставить конструкторы принимать ссылки на константные значения следующим образом:

explicit Specialization(const std::string& new_value) {
    data = new_value;
}

explicit Course(const std::string& new_value) {
    data = new_value;
}

explicit Week(const std::string& new_value) {
    data = new_value;
}

LectureTitle(const Specialization& new_value1, const Course& new_value2, const Week new_value3) {
    specialization = new_value1.data;
    course = new_value2.data;
    week = new_value3.data;
}

Константные ссылки на lvalue могут связываться с rvalue - то есть увеличивать время жизни временного объекта; и эти временные значения могут быть использованы для инициализации переменных-членов в ваших конструкторах.

...