Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Ошибка в шаблоне "Qualifier 't' is not a class or namespace name"

Приветствую всех. Создал шаблон, а компилятор ругает. Подскажите, как исправить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
enum class T1 { one, two, end };
 
template <typename T> bool BeyondEdge(T &t)
{
 return (t < 0 || t >= t::end); /* Qualifier 't' is not a class or namespace name */
}
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 T1 t1;
 t1 = T1(12);
 BeyondEdge(t1);
}
Ответ: volvo, спасибо. Этот шаблон проверяет мои перечисления. У них обязательно есть член End.
Вопрос: Разработать класс содержащий перегрузку операторов

Создать класс Money, содержащий следующие члены класса:

+1. Поля:
•int first;//номинал купюры
•int second; //количество купюр

+2. Конструктор, позволяющий создать экземпляр класса с заданными значениям полей.

+3. Методы, позволяющие:
•вывести номинал и количество купюр;
•определить, хватит ли денежных средств на покупку товара на сумму N рублей.
•определить, сколько штук товара стоимости n рублей можно купить на имеющиеся денежные средства.

+4. Свойство:
•позволяющее получить - установить значение полей (доступное для чтения и записи);
•позволяющее расчитатать сумму денег (доступное только для чтения).

+5. Индексатор, позволяющий по индексу 0 обращаться к полю first, по индексу 1 – к полю second, при других значениях индекса выдается сообщение об ошибке.

+-6. Перегрузку:
•операции ++ (--): одновременно увеличивает (уменьшает) значение полей first и second;
•операции !: возвращает значение true, если поле second не нулевое, иначе false;
•операции бинарный +: добавляет к значению поля second значение скаляра.

Добавлено через 50 секунд
У меня получилось так:
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
 
namespace prakt_10
{
    class Program
    {
        class Money
        {
            private int first;
            private int second;
 
            public Money(int first, int second)
            {
                this.first = first;
                this.second = second;
            }
 
            // methods
            public void Show()
            {
                Console.WriteLine("first: {0}, second: {1}", this.first, this.second);
            }
 
            public void Enough_Deficiency(int price)        // enough or not enough
            {
                if (this.first * this.second >= price)
                {
                    Console.WriteLine("Enough funds.");
 
                    double numObj = this.first * this.second / price;
                    numObj = Convert.ToInt16(Math.Floor(numObj));       // rounded <-
 
                    Console.WriteLine("Funds enough to buy {0} objects", numObj);
                }
 
                else
                {
                    Console.WriteLine("Insufficiently!");
                }
            }
 
            // properties
            public int values_first
            {
                get { return this.first; }
                set { this.first = value; }
            }
 
            public int values_second
            {
                get { return this.second; }
                set { this.second = value; }
            }
 
            public int Cash
            {
                get { return this.first * this.second; }
            }
 
            public int this[int i]
            {
                get
                {
                    if (i == 0)
                    { return this.first; }
 
                    else
                    {
                        if (i == 1)
                        { return this.second; }
 
                        else
                        { 
                            Console.WriteLine("Error! Invalid index.");
                            return -1;
                        }
                    }
                }
 
            }
        }
 
        // owerload
        /*
        public static Money operator ++(Money M)
        {
            Money M1 = new Money(M.values_first *= 10, M.values_second *= 10);
            return M1;
        }
 
        public static Money operator --(Money M)
        {
            Money M1 = new Money(M.values_first /= 10, M.values_second /= 10);
            return M1;
        }
        
        public static Money operator !(Money M)
        {
            bool cash = false;
            if (M.values_second > 0)
            {
                cash = true;
            }
            
            return cash;
        }
 
        public static Money operator +(Money M, int skal)
        {
            Money M1 = new Money(M.values_first, M.values_second * skal);
            return M1;
        }
        */
 
 
 
        static void Main(string[] args)
        {
            int first = int.Parse(Console.ReadLine());
            int second = int.Parse(Console.ReadLine());
            int price = int.Parse(Console.ReadLine());
 
            Money M1 = new Money(first, second);
 
            // tests
            M1.Show();
            M1.Enough_Deficiency(price);
            Console.WriteLine(M1.Cash);
 
            M1.values_first = 100;
            M1.values_second = 100;
            M1.Show();
 
            Console.ReadKey();
        }
    }
}
Добавлено через 1 минуту
Не могу понять в чем ошибка перегрузки операторов. Помогите плиз, как исправить?
Ответ: olli_, перегрузка операторов должна находиться внутри класса для которого она реализуется
Вопрос: В чем ошибка? Перегрузка оператора ввода\вывода

Доброго времени суток. Где я допустил ошибку?
Перегрузка оператора как-будто игнорируется. Выводит просто "test", а я ожидаю "[INFO]: test".
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cstdlib>
#include <string>
 
std::ostream &operator << (std::ostream &out, const char* &a){
    out << "[INFO]: " << a << std::endl;
    return out;
}
 
int main(int argc, char* argv[]){
    std::cout << "test";
    return 0;
}
Ответ: Для класса оператор должен быть friend и в качестве второго параметра - класс.
Зачем городить такое из-за INFO? Сделай тогда простую функцию и передавай в неё строку.
Вопрос: При установке шаблон,ошибка: этот шаблон попытался загрузить составляющую сборку

Здравствуйте!
Пытаюсь добавить в vs 2010 ADO.NET Entity Data Model и вот какая досада, выскакивает ошибка:

и аналогично,с любым другим шаблоном
Ответ: insite2012, не помогло, попробую другу версию скачать
Вопрос: Ошибка в шаблоне функции

Доброго времени суток. У меня проблема с функцией для чтения таблицы из файла, которая спокойно работает с типами int и float, но не хочет работать как шаблон функции.
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename A>
A**readMatrix(int a, int b, string fileName){
    A**matrix = new A*[a];
    for(int i=0;i< a;i++) matrix[i]=new A[a];
    ifstream read;
    read.open(fileName);
    for(int i=0;i< a;i++){
        for(int j=0;j< b;j++)
            read >> matrix[i][j];
    }
    read.close();
 
    return matrix;
};
int main(){
//........
    float ** fac= readMatrix(a, b, name);
//........
}
In function 'int main()':
error: no matching function for call to 'readMatrix(int&, int&, std::string&)'
float ** fac= readMatrix(a, b, name);
^
note: candidate is:
note: template<class A> A** readMatrix(int, int, std::string)
A **readMatrix(int a, int b, string fileName){
^
note: template argument deduction/substitution failed:
note: couldn't deduce template parameter 'A'
float ** fac= readMatrix(a, b, name);
Ответ: metjka, Возвращаемый тип как должны узнать? Зовите указывая явно.
Код C++
1
readMatrix<float>(a, b, name);
Вопрос: Ошибка с шаблонами

Возникла проблема. Пример: Создал шаблонный класс с двумя параметрами, один из которых задан по умолчанию. С одной стороны, все работает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
template <class A, class B = A>
class MyClass{
    A a;
    B b;
    public:
        void foo(){
            cout << "Hello";
        };
};
 
int main(){
    MyClass <int> test;
    test.foo();
    return 0;
}

Но если сделать все порядочно и вынести реализация методов за их объявление:

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 A, class B = A>
class MyClass{
    A a;
    B b;
    public:
    void foo();
};
 
template <class A, class B = A>
void MyClass <A>:: foo(){
    cout << "Hello";
}
 
int main(){
    MyClass <int> test;
    test.foo();
    return 0;
}
Выдает ошибку компиляции
Сообщение об ошибке:
Code
1
2
3
4
||=== Build: Debug in template test (compiler: GNU GCC Compiler) ===|
D:\Programming\C++\Projects\template test\main.cpp|14|error: invalid use of incomplete type 'class MyClass<A>'|
D:\Programming\C++\Projects\template test\main.cpp|6|error: declaration of 'class MyClass<A>'|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Что я делаю не так? Как правильно?
Ответ:
Сообщение от NikBond
Как правильно?
C++
1
2
3
4
template <class A, class B >
void MyClass <A, B>:: foo(){
    cout << "Hello";
}
Вопрос: Ошибки с Шаблонами в Visual Studio 2013

Доброго времени суток, что означают следующие ошибки? и как их можно исправить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Stack.h
#include <iostream>
 
using namespace std;
 
#include <iomanip>
 
template <typename T>
class Stack
{
private:
    T *stackPtr; 
    int size;
    T top; 
public:
    Stack(int = 10);
    ~Stack(); 
    bool push(const T); 
    bool pop();
    void printStack();
};
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
//Stack.cpp
#include"Stack.h"
 
 
template <typename T>
Stack<T>::Stack(int s)
{
    size = s > 0 ? s : 10;   
    stackPtr = new T[size]; 
    top = -1; 
}
 
template <typename T>
Stack<T>::~Stack()
{
    delete[] stackPtr; 
}
 
                
template <typename T>
bool Stack<T>::push(const T value)
{
    if (top == size - 1)
        return false; 
 
    top++;
    stackPtr[top] = value; 
 
    return true; 
}
 
template <typename T>
bool Stack<T>::pop()
{
    if (top == -1)
        return false; 
 
    stackPtr[top] = 0; 
    top--;
 
    return true;
}
 
template <typename T>
void Stack<T>::printStack()
{
    for (int ix = size - 1; ix >= 0; ix--)
        cout << "|" << setw(4) << stackPtr[ix] << endl;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Main.cpp
#include "Stack.h"
 
int main()
{
    Stack <int> myStack(5);
 
    cout << "Enter a elements to stack ";
    int ct = 0;
    while (ct++ != 5)
    {
        int temp;
        cin >> temp;
        myStack.push(temp);
    }
    myStack.printStack(); 
    cout << "\nRemove two elements from stack:\n";
    myStack.pop(); 
    myStack.pop(); 
    myStack.printStack(); 
 
    return 0;
}
Заранее спс.
Ответ: HelicopterK52, спс.
Но уже разобрался.
Вопрос: Ошибка преобразование типов

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication5
{
    class Program
    {
        static double max = 0, n = 0;
        static void Ent(double[] x)
        {
            try
            {
                Console.WriteLine("Введите значения");
                for (int i = 0; i < n; i++)
                    x[i] = Convert.ToDouble(Console.ReadLine());
            }
            catch (FormatException)
            {
                Console.WriteLine("Ошибка, не является числом");
                Console.ReadLine();
                Ent(x);
            }
            catch (OverflowException)
            {
                Console.WriteLine("Ошибка! Перегрузка!");
                Console.ReadLine();
                Ent(x);
            }
        }
 
        static void Normal(double[] x)
        {
            for (int i = 0; i < n; i++)
            {
                if (max < x[i])
                {
                    max = x[i];
                }
            }
            Console.WriteLine("Максимальный элемент");
            Console.WriteLine(max);
            for (int i = 0; i < n; i++)
            {
                try
                {
                    x[i] = x[i] / max;
                    Console.WriteLine(x[i]);
                }
                catch (DivideByZeroException)
                {
                    Console.WriteLine("Деление на 0. Выход");
                    Console.ReadKey();
                    Environment.Exit(0);
                }
            }
            Console.WriteLine("nagmite to exit");
            Console.ReadKey();
        }
 
        static void Main()
        {
            Console.WriteLine("Введите количество элементов:");
            try
            {
                n = Convert.ToInt32(Console.ReadLine());
            }
            catch (FormatException)
            {
                Console.WriteLine("Ошибка, не является числом");
                Console.ReadLine();
                Main();
            }
            catch (OverflowException)
            {
                Console.WriteLine("Ошибка! Перегрузка!");
                Console.ReadLine();
                Main();
            }
            try
            {
                double[] x = new double[n]; [B]Ошибка   "Не удается неявно преобразовать тип "double" в "int". Существует явное преобразование (возможно, пропущено приведение типов)"[/B]
                Ent(x);
                Normal(x);
            }
            catch (OverflowException)
            {
                Console.WriteLine("Ошибка! Перегрузка!");
                Console.ReadLine();
                Main();
            }
        }
    }
}
помогите что исправить
Ответ: спасибо
Вопрос: Visual C++ 2015 и 2010 шаблоны

возникла такая, проблема писал программу на Visual C++ 2015, а есть возможность сдать её в Visual C++ 2010
при компиляции моего кода, выдаются ошибки 6 штук, все они, по-моему, связаны с тем, что vs 2010 не поддеривает некоторые библиотеки или что-то в этом роде.
Помогите пожалуйста
Вот код программы
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
#include <Windows.h>
#include <time.h>
#include<iostream>
#include<string.h>
using namespace std;
class Transport{
    char  NameTrans[30], skorost[30];
public:
    Transport();//конструктор безпараметра
    Transport(char *NameTr,char *skor);//конструкор с двумя параметрами
    void Print();
    ~Transport();
    char *Get_NameTrans();
    char *Get_skorost();
    Transport &operator=(const Transport &B);
};
template<class T>
class List{
    T Object;
    List<T> *next = NULL;
    List<T> *first = NULL;
    List<T> *Get_last();
    int Size;
public:
    List();
    List(T *B, int n);
    List(const List<T> &B);
    void Input(T object);
    void Print();
    T operator[](int i);
    List<T> operator+(List<T> B);
    bool operator==(List<T> B);
    List<T> &operator=(const List<T> &B);
    ~List();
};
 
template<class T>
List<T> *List<T>::Get_last() {
    if (first) {
        List<T> *cur = first;
        while (cur->next) cur = cur->next;
        return cur;
    }
    else return NULL;
}
 
template<class T>
List<T>::List() {
    Object = NULL;
    next = NULL;
    first = NULL;
    Size = 0;
}
List<Transport>::List() {
    Transport Object;
    next = NULL;
    first = NULL;
    Size = 0;
}
template<class T>
List<T>::List(T *B, int n) {
    List<T> *cur;
    for (int i = 0; i < n; i++) {
        List<T> *Add = new List<T>;
        Add->Object = B[i];
        Add->next = 0;
        if (first) {
            cur->next = Add;
            cur = cur->next;
        }
        else {
            first = Add;
            cur = first;
        }
    }
    Size = n;
}
template<class T>
List<T>::List(const List<T> &B) {
    List<T> *cur2 = B.first;
    List<T> *cur = first;
    for (int i = 0; i < B.Size; i++) {
        List<T> *Add = new List<T>;
        Add->Object = cur2->Object;
        Add->next = 0;
        if (first) {
            cur->next = Add;
            cur = cur->next;
        }
        else {
            first = Add;
            cur = first;
        }
        cur2 = cur2->next;
    }
    Size = B.Size;
}
 
template<class T>
void List<T>::Input(T object) {
    List<T> *Add = new List<T>;
    List<T> *last = Get_last();
    Add->next = 0;
    Add->Object = object;
    Size++;
    if (last) last->next = Add;
    else first = Add;
}
 
template<class T>
void List<T>::Print() {
    if (first) {
        List<T> *cur = first;
        while (cur) {
            cout << cur->Object << " ";
            cur = cur->next;
        }
    }
    else cout << "Список пуст";
    cout << endl << "-----------------------" << endl;
}
void List<Transport>::Print() {
    List<Transport> *cur = first;
    if (first) {
        while (cur) {
            cout << "Название транспорта: " << cur->Object.Get_NameTrans() << " Скорость: " << cur->Object.Get_skorost() << endl;
            cur = cur->next;
        }
    }
    else cout << "Список пуст";
    cout << endl << "-----------------------" << endl;
}
 
template<class T>
T List<T>::operator[](int i) {
    if (i > 0 && i <= Size) {
        List<T> *cur = first;
        int pos = 1;
        while (i != pos) {
            cur = cur->next;
            pos++;
        }
        return cur->Object;
    }
    else throw 1;
}
 
template<class T>
List<T> List<T>::operator+(List<T> B) {
    List<T> Temp;
    List<T> *cur = Temp.first;
    List<T> *cur1 = first;
    List<T> *cur2 = B.first;
    for (int i = 0; i < Size; i++) {
        List<T> *Add = new List<T>;
        Add->Object = cur1->Object;
        Add->next = 0;
        if (Temp.first) {
            cur->next = Add;
            cur = cur->next;
        }
        else {
            Temp.first = Add;
            cur = Temp.first;
        }
        cur1 = cur1->next;
    }
    for (int i = 0; i < B.Size; i++) {
        List<T> *Add = new List<T>;
        Add->Object = cur2->Object;
        Add->next = 0;
        if (Temp.first) {
            cur->next = Add;
            cur = cur->next;
        }
        else {
            Temp.first = Add;
            cur = Temp.first;
        }
        cur2 = cur2->next;
    }
    Temp.Size = Size + B.Size;
    return Temp;
}
template<class T>
List<T> &List<T>::operator=(const List<T> &B) {
    List<T> Temp;
    List<T> *cur1 = B.first;
    List<T> *cur = first;
    if (this != &B) {
        if (Size) {
            List<T> *del = first;
            while (del) {
                first = first->next;
                delete del;
                del = first;
            }
        }
        for (int i = 0; i < B.Size; i++) {
            List<T> *Add = new List<T>;
            Add->Object = cur1->Object;
            Add->next = 0;
            if (first) {
                cur->next = Add;
                cur = cur->next;
            }
            else {
                first = Add;
                cur = first;
            }
            cur1 = cur1->next;
        }
        Size = B.Size;
    }
    return *this;
}
 
template<class T>
bool List<T>::operator==(List<T> B) {
    List<T> *cur1 = first;
    List<T> *cur2 = B.first;
    if (Size == B.Size) {
        while (cur1 && cur2) {
            if (cur1->Object != cur2->Object) return false;
            cur1 = cur1->next;
            cur2 = cur2->next;
        }
    }
    else return false;
    return true;
}
 
bool List<Transport>::operator==(List<Transport> B) {
    List<Transport> *cur1 = first;
    List<Transport> *cur2 = B.first;
    if (Size == B.Size) {
        while (cur1 && cur2) {
            if (strcmp(cur1->Object.Get_NameTrans(), cur2->Object.Get_NameTrans()) || strcmp(cur1->Object.Get_skorost(),cur2->Object.Get_skorost())) return false;
            cur1 = cur1->next;
            cur2 = cur2->next;
        }
    }
    else return false;
    return true;
}
template<class T>
List<T>::~List() {
    List<T> *del = first;
    while (del) {
        first = first->next;
        delete del;
        del = first;
    }
}
Transport::Transport(){
    NameTrans[0] = '\0';
    skorost[0] = '\0';
}
Transport::Transport(char *NameTr, char *skor){
        strcpy(NameTrans, NameTr);
        strcpy(skorost, skor);
}
 
void Transport::Print(){
    if (strlen(NameTrans) && strlen(skorost)){
        cout << "Название транспорта: " << NameTrans << endl;
        cout << "Скорость: " << skorost << endl;
    }
    else throw 1;
}
 
Transport::~Transport(){
}
 
char *Transport::Get_NameTrans(){
    return NameTrans;
}
char *Transport::Get_skorost(){
    return skorost;
}
 
Transport &Transport::operator=(const Transport &B){
    if (this != &B){
        strcpy(NameTrans, B.NameTrans);
        strcpy(skorost, B.skorost);
    }
    return *this;
}
int main() {
    srand(time(0));
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int n, random;
    char NameTrans[100], skorost[100];
    List<int> A;
    List<int> B;
    cout << "Введите размерность списка 1: ";
    cin >> n;
    for (int i = 0; i < n; i++) {
        random = rand() % 100 - 50;
        A.Input(random);
    }
    cout << "Введите размерность списка 2: ";
    cin >> n;
    for (int i = 0; i < n; i++) {
        random = rand() % 100 - 50;
        B.Input(random);
    }
    system("cls");
    A.Print();
    B.Print();
    List<int> C = A + B;
    C.Print();
    if (A == B) cout << "Списки равны" << endl;
    else cout << "Списки не равны" << endl;
    cout << "Введите элемент списка А, который нужно вывести: ";
    cin >> n;
    try {
        cout << A[n] << endl;
    }
    catch (int)
    {
        cout << "Элемента с данным индексом не существует" << endl;
    }
    cout << "Введите элемент списка B, который нужно вывести: ";
    cin >> n;
    try {
        cout << B[n] << endl;
    }
    catch (int)
    {
        cout << "Элемента с данным индексом не существует" << endl;
    }
    system("pause");
    system("cls");
    cout << "Переход к пользовательскому типу" << endl;
    List<Transport> A1;
    List<Transport> A2;
    cout << "Введите размерность списка 1: ";
    cin >> n;
    for (int i = 0; i < n; i++) {
        cout << "Введите название государства: ";
        cin >> NameTrans;
        cout << "Введите название дату основания: ";
        cin >> skorost;
        Transport Gos(NameTrans, skorost);
        A1.Input(Gos);
    }
    cout << "Введите размерность списка 2: ";
    cin >> n;
    for (int i = 0; i < n; i++) {
        cout << "Введите название транспорта: ";
        cin >> NameTrans;
        cout << "Введите скорость: ";
        cin >> skorost;
        Transport Gos(NameTrans, skorost);
        A2.Input(Gos);
    }
    A1.Print();
    A2.Print();
    List<Transport> A3 = A1 + A2;
    A3.Print();
    cout << "Введите элемент списка 1, который нужно вывести: ";
    cin >> n;
    try {
        A1[n].Print();
    }
    catch (int)
    {
        cout << "Элемента с данным индексом не существует" << endl;
    }
    cout << "Введите элемент списка 2 компл. чисел, который нужно вывести: ";
    cin >> n;
    try {
        A2[n].Print();
    }
    catch (int)
    {
        cout << "Элемента с данным индексом не существует" << endl;
    }
    if (A1 == A2) cout << "Списки равны" << endl;
    else cout << "Списки не равны" << endl;
    system("pause>>void");
}
Ответ: само задание следующие:
Класс - однонаправленный список list. Дополнительно перегрузить следующие операции:
() -удалить элемент в заданной позиции, например:
int i;
list L;
L(i);
() - добавить элемент в заданную позицию, например:
int i;
Type c;
list L;
L(с,i);
!= - проверка на неравенство.
класс транспорт содержит в себе название транспорта и его скорость
написал программу вот так:
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <iostream>
#include <math.h>
using namespace std;
// Polzovatelskiy klass
class Transport {
    string NameTrans;
    int skorost;
public:
    void set_NameTrans(string Name) { NameTrans=Name; }
    void set_skorost(int sk) {skorost=sk; }
    Transport( string NameTrans="slomai_sebe_komp", int skorost=13): NameTrans(NameTrans), skorost(skorost) { }
    /* friend ostream& operator<<(ostream& os, const Transport& v) {
        os << "(" << v.NameTrans << ", " << v.skorost << ")";
        return os;
    };*/
    /* friend istream& operator>>(istream& in, Transport& v) {
        cout << "NameTrans1: "; in >> v.NameTrans;
        cout << "skorost1: "; in >> v.skorost;
        return in;
    }*/
    };
 
template <class T>
struct Element {
    T val;
    Element<T>* next;
    Element() {
        next = NULL;
    }
};
 
template <class T>
class List {
public:
//конструктор без параметра
    List<T>() 
    {
        p_first = NULL;
        p_last = NULL;
        size = 0;
    };
//конструктор копирования
    List<T>(const List& old_list) 
    {
        p_first = NULL;
        p_last = NULL;
        size = 0;
        Element<T>* p = old_list.p_first;
        while (p != NULL) {
            this->append(p->val);
            p = p->next;
        }
    };
//функция размер
    size_t get_size() const 
    {
        return size;
    }
//деструктор
    ~List<T>() 
    {
        Element<T>* temp;
        while (p_first != NULL) 
        {
            temp = p_first;
            p_first = p_first->next;
            delete temp;// Удаление указателя
        }
    };
//функция добавления
    void append(T& val) 
    {
        if (p_first == NULL) 
        {
            p_last = new Element<T>;
            p_first = p_last;
        } else {
            p_last->next = new Element<T>;
            p_last = p_last->next;
        }
        p_last->val = val;// Присваиваем новое значение
        size++;
    };
  //функция вывода  
    void show_all() {
       static Element<T>* temp_p;// Временный указатель
        temp_p = p_first;
        cout << "[";
        while (temp_p != NULL) {
            cout << temp_p->val << ", ";
            temp_p = temp_p->next;
        }
        cout << "]" << endl;
    }
//перегрузка оператора <<
    friend std::ostream& operator<<(std::ostream& os, const List<T>& list) 
    {
        Element<T>* temp_p;
        temp_p = list.p_first;
        os << "[";
        while (temp_p != NULL) {
            os << temp_p->val << ", ";
            temp_p = temp_p->next;
        }
        os << "]";
        return os;
    }
//перегрузка оператора >>
    friend std::istream& operator>>(std::istream &in, List<T>& list) {
        T temp;
        in >> temp;
        list.append(temp);
        return in;
    }
 List<T>& operator()(int i)//Перегрузка операции удаление по номеру   
   {    if (i>size) 
            {
                cout<<"Введённый индекс превышает размер списка!";
                return *this;
             }
        if (p_first == NULL) return *this;
        if (p_first == p_last) 
        {
            p_first = NULL;
            delete p_last;
            p_last = NULL;
            size = 0;
            return *this;
        }
        int ind=0; Element<T>* p;
        if (ind=i)
        {
            p = p_first->next;// 1 Запоминание удаляемого звена для операции delete
          p_first->next = p->next; // 2 Проведение новой связи в обход удаляемого звена
          delete p;
        }
        else {p_first = p_first->next; ind++;}
        --size;
        return *this;
    }
  List<T>& operator++ (T c,int i)//Перегрузка операции добавления по номеру  
    {
        if (size == 0) 
        {
            append(c);
            return;
        }
        Element<T>* p = new Element<T>;
         p->c = c;int ind=0;
        if (ind=i)
        {  
            p->next = p_first->next; // 3 Проведение связи от нового звена к следующему
           p_first->next = p;       // 4 Проведение связи от "старого" звена к новому
                       
        }
        else {p_first = p_first->next; ind++;}
         ++size;
          return *this;
    }
    bool operator!=(const List<T>& L) const {
        if (size != L.size)
            cout<<"Списки не равны!";
        if (size == L.size) {
 
            Element<T>* p1 = p_first;
            Element<T>* p2 = L.p_first;
            while (p1 != NULL) {
                if (p1->val != p2->val)
                    return false;
                p1 = p1->next;
                p2 = p2->next;
            }
            return true;
        }
        return false;
    }
 
private:
    Element<T>* p_first;
    Element<T>* p_last;
    size_t size;
};
int main () {
    List<Transport> L;
    //Transport(2, 5) + L; // Proverka 1 peregruzki
    cin >> L; // Zapolnim eshe
    cout << L << endl;
    List<Transport> L2 = L;
    cout << "(L != L2): " << (L != L2) << endl; // 3 peregruzka, doljno true
    //--L; // Proverka vtoroy
    cout << "(L != L2): " << (L != L2) << endl; // 3 peregruzka eshe raz, teper' false
 
 
    return 0;
}
ошибки
"operator ++" имеет слишком много формальных параметров
List<T>::operator ++: ошибка в объявлении функции; пропуск основного текста функции

Добавлено через 1 час 3 минуты
вроде всё исправил, но только с утра получится запустить нормально
надеюсь всё получится
Вопрос: Шаблоны. Ошибка линкера

Доброго времени суток, уважаемые форумчане!

Начал постигать дзен шаблонов С++. Собственно задача сделать класс-шаблон "Матрица" с перегрузкой операторов сложения, умножения, сравнения и бла-бла-бла. Описал только конструктор и деструктор и решил проверить, а компоновщик меня матом кроет.

Пишет:
[Linker Error] Unresolved external 'TMatrix<int>::~TMatrix<int>()' referenced from (путь к obj-файлу) и
[Linker Error] Unresolved external 'TMatrix<int>::TMatrix<int>(int, int, int * *)' referenced from (путь к obj-файлу).

Как пофиксить не знаю.

Заголовочный файл:
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T> class TMatrix
{
  public:
          TMatrix(int, int, T**);
          ~TMatrix();
 
  private:
          int Length;
          int Width;
 
          T** Matrix;
};
Срр-файл:
Код C++
1
2
3
4
5
//---------------------------------------------------------------------------
template<class T> TMatrix<T>::TMatrix(int _length, int _width, T** _matrix):
        Length(_length), Width(_width), Matrix(_matrix) {}
//---------------------------------------------------------------------------
template<class T> TMatrix<T>::~TMatrix() {}
Main:
Код C++
1
2
3
4
5
6
7
int main(int argc, char* argv[])
{
        TMatrix<int> t(5,5,NULL);
 
        system("pause");
        return 0;
}
По задумке, в данной ситуации для проверки должен был создаться класс, в котором содержался бы пустой указатель на int и width=length=5, но из-за ошибки программа не запускается.

Прошу помощи в отладке. Заранее спасибо
Ответ: bogdan_017, определение шаблона должно быть полностью доступно в точке инстанцирования. Иначе нельзя будет по шаблону сгенерировать код.
Самый простой способ этого добиться - поместить определение шаблона полностью в заголовочный файл.
Иными словами, убери cpp, реализацию шаблонных методов оставь в h.