Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 47
1

Ошибка: Невозможно преобразовать аргумент из "VM::vector<double,2>" в "VM::vector<double,2>"

25.05.2019, 14:26. Просмотров 1638. Ответов 4

Невозможно преобразовать аргумент 1 из "VM::vector<double,2>" в "VM::vector<double,2>". Что за бред ребят? Вот весь код(операцию = он тоже не принимает, поэтому написал функцию rav(),но с ней вот такая ошибка)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
namespace VM
{
    template<class T, int n>
    class vector
    {
        T lc[n];
        void SumOrMinus(vector&, vector&,int ed); //ed == 1 or ed == -1
    public:
        vector() {};
        vector(const std::initializer_list<T>&);
        explicit vector(vector&);
        const T&operator[](int i)const
        {
            return lc[i];
        }
        T&operator[](int i)
        {
            return lc[i];
        }
        void operator=(vector);
        void rav(vector<T, n> v);
        void operator=(T mass[]);
        vector operator+(vector&);
        void operator+=(vector&);
        vector operator-(vector&);
        void operator*=(double n);
        double length();
        void SetNull() { lc[0] = -503; };
        bool CheckNull() { return lc[0] < 0; };
        int normilise();
    };
    template<class T, int n>
    vector<T, n>::vector(const std::initializer_list<T>&in)
    {
        int size = n < in.size() ? n : in.size();
        int i = 0;
        for (const T&s : in)
        {
            if (i >= size)
                break;
            lc[i] = s;
            i++;
        }
    }
    template<class T, int n>
    vector<T, n>::vector(vector<T, n>&v)
    {
        this->operator=(v);
    }
    template<class T, int n>
    double vector<T, n>::length()
    {
        double r{};
        for (int i = 0; i < n; i++)
        {
            r += pow(lc[i], 2);
        }
        return sqrt(r);;
    }
    template<class T, int n>
    void vector<T, n>::operator=(vector<T, n> v)
    {
        rav(v);
    }
    template<class T, int n>
    void vector<T, n>::rav(vector<T, n> v)
    {
        for (int i = 0; i < n; i++)
            lc[i] = v.lc[i];
    }
    template<class T, int n>
    void vector<T, n>::operator=(T mass[])
    {
        for (int i = 0; i < n; i++)
            lc[i] = mass[i];
    }
    template<class T, int n>
    void vector<T, n>::operator*=(double num)
    {
        for (int i = 0; i < n; i++)
            lc[i] *= num;
    }
    template<class T, int n>
    void vector<T, n>::operator+=(vector<T, n>&v)
    {
        for (int i = 0; i < n; i++)
            lc[i] += v.lc[i];
    }
    template<class T, int n>
    vector<T, n> vector<T, n>::operator+(vector<T, n>& v)
    {
        vector<T, n> r;
        SumOrMinus(r, v, 1);
        return r;
    }
    template<class T, int n>
    vector<T, n> vector<T, n>::operator-(vector<T, n>& v)
    {
        vector<T, n> r;
        SumOrMinus(r, v, -1);
        return r;
    }
    template<class T, int n>
    void vector<T, n>::SumOrMinus(vector<T, n>& write, vector<T, n>& v, int ed)
    {
        for (int i = 0; i < n; i++)
            write[i] = lc[i] + (v.lc[i] * ed);
    }
    template<class T, int n>
    int vector<T, n>::normilise()
    {
        T l = length();
        for (int i = 0; i < n; i++)
            lc[i] /= l;
        return l;
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2019, 14:26
Ответы с готовыми решениями:

Ошибка "невозможно преобразовать аргумент 1 из "Myclass" в "double""
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cmath&gt; using namespace std; class Myclass {...

Ошибка "Невозможно преобразовать аргумент 1 из "double" в "double *"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double f(double *a, double x) {...

Непонятная ошибка: невозможно преобразовать "double" в "double *"
Нужно занести двойному нулевому указателю адрес указателя. Компилятор выдает ошибку: невозможно...

Ошибка (активно) E0167 аргумент типа "double" несовместим с параметром типа "double *"
Ошибка (активно) E0167 аргумент типа &quot;double&quot; несовместим с параметром типа &quot;double *&quot; Ругается...

4
2655 / 1831 / 548
Регистрация: 05.06.2014
Сообщений: 5,297
25.05.2019, 14:34 2
Лучший ответ Сообщение было отмечено Dimgo2 как решение

Решение

Для начала const vector& в конструкторе. Да и вообще везде, куда воткнется.
1
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 47
25.05.2019, 14:37  [ТС] 3
Ребята, если я правильно понял, ошибка вот в чем. Когда я передаю в функция объект по значению, происходит его копирование, где употребляется не почленная инициализация (по моему предположению), а конструктор копирования(vector(vector&)). В результате ошибка. Но эта ошибка должна же быть времени выполнения, а не компиляции.
0
2655 / 1831 / 548
Регистрация: 05.06.2014
Сообщений: 5,297
25.05.2019, 14:45 4
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Но эта ошибка должна же быть времени выполнения, а не компиляции.
Какая-то коллизия между explict ограничивающим неявные преобразования и "конструктор копирования принимает константу. Варианты ответа: А) Да. Б) Есть. В) Так точно.". Лень вникать. Просто пихайте const в максимальное количество мест и таких грабель станет значительно меньше.
1
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 576
25.05.2019, 15:40 5
У меня всё скомпилилось. Создаю вот такой вектор:
C++
1
VM::vector<int, 10> v{ 1, 2, 3, 4, 5 };
Но в целом, код косячный. Например, зачем explicit у копирующего конструктора? Список инициализации обычно передают по значению. Перегруженные операторы имеют неверные возвращаемые значения. Ну и т.п.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2019, 15:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)"
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double...

C2440 "Невозможно преобразовать double в double"
// ConsoleApplication3.cpp: определяет точку входа для консольного приложения. // #include...

Исправить ошибки "cannot convert 'double (*)(double)' to 'double'" и "too many arguments to function"
пожалуйста проверьте и помогите исправить ошибки: #include&lt;iostream&gt; #include&lt;stdio.h&gt;...

Ошибка: "невозможно преобразовать аргумент 1 из "int [3][3]" в "int **""
Приветствую, сделал задание, но выдает вот такую ошибку &quot;int sum(int **,int)&quot;: невозможно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.