Error c2760 синтаксическая ошибка непредвиденный токен идентификатор требуется спецификатор типа

C++ Documentation. Contribute to MicrosoftDocs/cpp-docs development by creating an account on GitHub.
description title ms.date f1_keywords helpviewer_keywords ms.assetid

Learn more about: Compiler Error C2760

Compiler Error C2760

08/12/2021

C2760

C2760

585757fd-d519-43f3-94e5-50316ac8b90b

Compiler Error C2760

syntax error : expected ‘name1‘ not ‘name2
syntax error : unexpected token ‘token1‘, expected ‘token2
syntax error: ‘token1‘ was unexpected here; expected ‘token2

Remarks

There are several ways to cause this error. Usually, it’s caused by a token sequence that the compiler can’t make sense of.

Example

In this sample, a casting operator is used with an invalid operator.

// C2760.cpp
class B {};
class D : public B {};

void f(B* pb) {
    D* pd1 = static_cast<D*>(pb);
    D* pd2 = static_cast<D*>=(pb);  // C2760
    D* pd3 = static_cast<D*=(pb);   // C2760
}

The new lambda processor available under /std:c++20 or later, or under /Zc:lambda, enables some new conformance-mode syntactic checks in generic lambdas. The legacy lambda processor compiles this code without warnings, but the new lambda processor produces error C2760:

void f() {
    auto a = [](auto arg) {
        decltype(arg)::Type t; // C2760 syntax error: unexpected token 'identifier', expected ';'
    };
}

This example shows the correct syntax, now enforced by the compiler, which works in all /std modes:

void f() {
    auto a = [](auto arg) {
        typename decltype(arg)::Type t;
    };
}

First note that if referring to a template argument dependent name like vector<T>::iterator here, then you need to put typename prior. Furthermore, depends on what T is, this would only compile if std::cout‘s operator<< is accepting this T. This, for example, compiles just fine:

#include <iostream>
#include <vector>

template <typename T>
void showset(std::vector<T> v)
{
    for (typename std::vector<T>::iterator it = v.begin(); it != v.end(); it++)
    {
        std::cout << *it;
    }
    std::cout << std::endl;
}

struct foo
{
};

int main()
{
    showset(std::vector<int>{1,2,3});
    //showset(std::vector<foo>{}); // Error: `cout` doesn't take `foo`s.

    return 0;
} 

With the auto-enhanced syntax of C++11, showset() could be written like this, and then the typename has no use : )

template <typename T>
void showset(std::vector<T> v)
{
    for (auto it = v.begin(); it != v.end(); it++)
    {
        std::cout << *it;
    }
    std::cout << std::endl;
}

Also since C++11, you can use the range-based for loop to achieve the same as in your original snippet:

template <typename T>
void showset(std::vector<T> v)
{
    for (auto& ref : v)
    {
        std::cout << ref;
    }
    std::cout << std::endl;
}

As with the lase version, because you’re not referring here to the iterator type there’s nothing to put typename for.


Do note that in both versions you are taking parameter v by value. Hence, you’re copying the entire vector for each function call. As the code is given in the question, there seem to be no reason for this and so you should be passing it by reference, and make it a const one too as you’re not modifying v anywhere inside of showset():

void showset(const std::vector<T>& v);

and then in the non-range-based for loop version don’t forget to change the loop statement accordingly:

for (typename std::vector<T>::const_iterator it = v.begin(); it != v.end(); it++)

holdem_

0 / 0 / 0

Регистрация: 27.10.2018

Сообщений: 21

1

04.05.2019, 22:41. Показов 7052. Ответов 12

Метки ООП, шаблоны (Все метки)


При компиляции выдает ошибку : Ошибка C2760 синтаксическая ошибка: ожидался токен «спецификатор типа», а не «идентификатор» .

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
//matrix.cpp
#include"matrix.h"
template <class T>
Matrix<T>::Matrix()
{
    size_col = 0;
    size_row = 0;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
}
//конструктор з параметрами
template <class T>
Matrix<T>::Matrix(int size_row_BuUser, int size_col_BuUser)
{
    size_row = size_col_BuUser;
    size_col = size_row_BuUser;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = 0;
            }
    }
    cout << "Matrix for random enter - 1nMatrix for user enter -2" <<
        endl << "Please enter:";
    int l = 1;
    cin >> l;
    switch (l)
    {
    case 1:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = rand() % 99;
            }
        break;
    case 2:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                cout << "a[" << i << "]" << "[" << j << "]" << "=";
                cin >> m_iArr[i][j];
            }
        break;
    }
}
template<class T>
Matrix<T>::Matrix(Matrix<T>& init)
{
    if (&m_iArr != 0)
    {
        for (int j = 0; j < size_row; j++)
        {
            delete &m_iArr[j];
        }
        delete[] m_iArr;
    }
    size_row = init.size_row;
    size_col = init.size_col;
    m_iArr = new init.T*[size_row];
    for (int i = 0; i < size_row; i++)
    {
            m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    for (int i = 0; i < size_row; i++)
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = init.m_iArr[i][j];
        }
}
 
template<class T>
Matrix<T>::~Matrix()
{
    for (int j = 0; j < size_row; j++)
    {
        delete m_iArr[j];
    }
    delete[] m_iArr;
}
template <class T>
ostream& operator<<(ostream& output, Matrix<T>& matr)
{
    for (int i = 0; i < matr.size_row; i++)
    {
        for (int j = 0; j < matr.size_col; j++)
        {
            output << matr.m_iArr[i][j] << " ";
        }
        output << endl;
    }
    output << endl;
    return output;
}
template<class T>
Matrix<T>& Matrix<T>::operator= (Matrix<T>& matr)
{
    if (this != &matr)
    {
        if (&m_iArr != 0)
        {
            for (int j = 0; j < size_row; j++)
            {
                delete m_iArr[j];
            }
            delete[] m_iArr;
        }
        size_row = matr.size_row;
        size_col = matr.size_col;
        m_iArr = new T *[size_row];
        for (int i = 0; i < size_row; i++)
        {
            m_iArr[i] = new T[size_col];
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = 0;
            }
        }
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = matr.m_iArr[i][j];
            }
    }
    cout << "Operator =" << endl;
    return *this;
}
 
template<class T>
void Matrix<T>::init_matrix()
{
 
    if (&m_iArr != 0)
    {
        for (int j = 0; j < size_row; j++)
        {
            delete m_iArr[j];
        }
        delete[] m_iArr;
    }
    
    cout << "enter row:";
    cin >> size_row;
    cout << "enter col:";
    cin >> size_col;
        m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    cout << "Matrix for random enter - 1nMatrix for user enter -2nPlease enter : ";
        int l = 1;
    cin >> l;
    switch (l)
    {
    case 1:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = rand() % 99;
            }
        break;
    case 2:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                cout << "a[" << i << "]" << "[" << j << "]" << "=";
                cin >> m_iArr[i][j];
            }
        break;
    }
}
template<class T>
int Matrix<T>::count_null()
{
    int count_null = 0;
    for (int i = 0; i < size_row; i++)
        for (int j = 0; j < size_col; j++)
        {
            if (m_iArr[i][j] == 0)
            {
                count_null++;
            }
        }
        cout << count_null << endl;
    return count_null;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//matrix.h
#pragma once
#include<iostream>
using namespace std;
template<class T>
class Matrix
{
private:
    T *m_iArr;
    int size_row;
    int size_col;
public:
    
    Matrix();
    Matrix(int size_row_BuUser, int size_col_BuUser);
    Matrix( Matrix& init);
    ~Matrix();
    friend ostream& operator<<  (ostream&, Matrix<T>&);
    Matrix& operator=(Matrix<T>& rhs);
    void init_matrix();
    int count_null();
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//main.cpp
#include"matrix.cpp"
int main()
{
    Matrix<int> m;
    m.count_null();
    int row, col;
    cin >> row;
    cin >> col;
    Matrix<int> m2(row, col);
    cout << m2;
    m2.count_null();
    m2.init_matrix();
    cout << m2;
    m = m2;
    cout << m;
    Matrix<int> m3(m2);
    cout << m3;
    return 0;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



143 / 92 / 34

Регистрация: 30.01.2018

Сообщений: 467

04.05.2019, 22:44

2

В какой строке ошибка, а то просматривать весь код очень муторно



0



0 / 0 / 0

Регистрация: 27.10.2018

Сообщений: 21

04.05.2019, 22:49

 [ТС]

3

в 69 строке

Добавлено через 51 секунду
в 69 строке

Добавлено через 48 секунд
в 69 строке



0



143 / 92 / 34

Регистрация: 30.01.2018

Сообщений: 467

04.05.2019, 22:52

4

Цитата
Сообщение от holdem_
Посмотреть сообщение

m_iArr = new init.T*[size_row];

Что такое init.T?
Может быть ты имел ввиду просто T?



1



0 / 0 / 0

Регистрация: 27.10.2018

Сообщений: 21

04.05.2019, 23:02

 [ТС]

5

Цитата
Сообщение от Pashka Durov
Посмотреть сообщение

Что такое init.T?
Может быть ты имел ввиду просто T?

Да , просто T должно быть

Добавлено через 2 минуты

Цитата
Сообщение от Pashka Durov
Посмотреть сообщение

Что такое init.T?
Может быть ты имел ввиду просто T?

Но когда делаю просто T , появляется
Ошибка C2440 =: невозможно преобразовать «T **» в «T *» 69 .



0



143 / 92 / 34

Регистрация: 30.01.2018

Сообщений: 467

04.05.2019, 23:04

6

Как у тебя сейчас 69 строка выглядит?



0



holdem_

0 / 0 / 0

Регистрация: 27.10.2018

Сообщений: 21

04.05.2019, 23:13

 [ТС]

7

C++
1
2
    
m_iArr = new T*[size_row];



0



Pashka Durov

143 / 92 / 34

Регистрация: 30.01.2018

Сообщений: 467

04.05.2019, 23:20

8

Попробуй так

C++
1
m_iArr = new T[size_row];

Но не гарантирую



0



holdem_

0 / 0 / 0

Регистрация: 27.10.2018

Сообщений: 21

05.05.2019, 11:52

 [ТС]

9

Цитата
Сообщение от Pashka Durov
Посмотреть сообщение

Попробуй так

C++
1
m_iArr = new T[size_row];

Но не гарантирую

На 69 строку перестало ругаться , но всеравно есть ошибка в 72 строке :
Ошибка C2440 =: невозможно преобразовать «T **» в «T *» 72 .

Добавлено через 1 минуту
Она так выглядет — m_iArr[i] = new T[size_col];



0



5695 / 3134 / 1306

Регистрация: 07.02.2019

Сообщений: 7,876

05.05.2019, 11:56

10

holdem_, Просто скопируй цикл из строк 25-28.
И распихивать реализацию шаблонных классов по разным файлам — не работает



0



0 / 0 / 0

Регистрация: 27.10.2018

Сообщений: 21

05.05.2019, 12:00

 [ТС]

11

Цитата
Сообщение от zayats80888
Посмотреть сообщение

holdem_, Просто скопируй цикл из строк 25-28.
И распихивать реализацию шаблонных классов по разным файлам — не работает

На эти строки тоже ругается .



0



zayats80888

5695 / 3134 / 1306

Регистрация: 07.02.2019

Сообщений: 7,876

05.05.2019, 12:16

12

Цитата
Сообщение от holdem_
Посмотреть сообщение

На эти строки тоже ругается

Матом?

Добавлено через 11 минут
holdem_,

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
//matrix.h
#pragma once
#include<iostream>
 
template<class T>
class Matrix
{
private:
    T** m_iArr;
    int size_row;
    int size_col;
public:
 
    Matrix();
    Matrix(int size_row_BuUser, int size_col_BuUser);
    Matrix(Matrix& init);
    ~Matrix();
    friend std::ostream& operator<<  (std::ostream&, Matrix<T>&);
    Matrix& operator=(Matrix<T>& rhs);
    void init_matrix();
    int count_null();
};
 
template <class T>
Matrix<T>::Matrix()
{
    size_col = 0;
    size_row = 0;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
}
//конструктор з параметрами
template <class T>
Matrix<T>::Matrix(int size_row_BuUser, int size_col_BuUser)
{
    size_row = size_col_BuUser;
    size_col = size_row_BuUser;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    std::cout << "Matrix for random enter - 1nMatrix for user enter -2" <<
        std::endl << "Please enter:";
    int l = 1;
    std::cin >> l;
    switch (l)
    {
    case 1:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = rand() % 99;
            }
        break;
    case 2:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                std::cout << "a[" << i << "]" << "[" << j << "]" << "=";
                std::cin >> m_iArr[i][j];
            }
        break;
    }
}
 
template<class T>
Matrix<T>::Matrix(Matrix<T>& init)
{
    if (&m_iArr != 0)
    {
        for (int j = 0; j < size_row; j++)
        {
            delete &m_iArr[j];
        }
        delete[] m_iArr;
    }
    size_row = init.size_row;
    size_col = init.size_col;
    m_iArr = new T*[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    for (int i = 0; i < size_row; i++)
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = init.m_iArr[i][j];
        }
}
 
template<class T>
Matrix<T>::~Matrix()
{
    for (int j = 0; j < size_row; j++)
    {
        delete m_iArr[j];
    }
    delete[] m_iArr;
}
 
template <class T>
std::ostream& operator<<(std::ostream& output, Matrix<T>& matr)
{
    for (int i = 0; i < matr.size_row; i++)
    {
        for (int j = 0; j < matr.size_col; j++)
        {
            output << matr.m_iArr[i][j] << " ";
        }
        output << std::endl;
    }
    output << std::endl;
    return output;
}
 
template<class T>
Matrix<T>& Matrix<T>::operator= (Matrix<T>& matr)
{
    if (this != &matr)
    {
        for (int j = 0; j < size_row; j++)
            delete m_iArr[j];
        delete[] m_iArr;
 
        size_row = matr.size_row;
        size_col = matr.size_col;
        m_iArr = new T *[size_row];
        for (int i = 0; i < size_row; i++)
        {
            m_iArr[i] = new T[size_col];
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = 0;
            }
        }
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = matr.m_iArr[i][j];
            }
    }
    std::cout << "Operator =" << std::endl;
    return *this;
}
 
template<class T>
void Matrix<T>::init_matrix()
{
 
    for (int j = 0; j < size_row; j++)
        delete m_iArr[j];
    delete[] m_iArr;
 
    std::cout << "enter row:";
    std::cin >> size_row;
    std::cout << "enter col:";
    std::cin >> size_col;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    std::cout << "Matrix for random enter - 1nMatrix for user enter -2nPlease enter : ";
    int l = 1;
    std::cin >> l;
    switch (l)
    {
    case 1:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = rand() % 99;
            }
        break;
    case 2:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                std::cout << "a[" << i << "]" << "[" << j << "]" << "=";
                std::cin >> m_iArr[i][j];
            }
        break;
    }
}
template<class T>
int Matrix<T>::count_null()
{
    int count_null = 0;
    for (int i = 0; i < size_row; i++)
        for (int j = 0; j < size_col; j++)
        {
            if (m_iArr[i][j] == 0)
            {
                count_null++;
            }
        }
    std::cout << count_null << std::endl;
    return count_null;
}



0



holdem_

0 / 0 / 0

Регистрация: 27.10.2018

Сообщений: 21

05.05.2019, 12:57

 [ТС]

13

Цитата
Сообщение от zayats80888
Посмотреть сообщение

Матом?

Добавлено через 11 минут
holdem_,

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
//matrix.h
#pragma once
#include<iostream>
 
template<class T>
class Matrix
{
private:
    T** m_iArr;
    int size_row;
    int size_col;
public:
 
    Matrix();
    Matrix(int size_row_BuUser, int size_col_BuUser);
    Matrix(Matrix& init);
    ~Matrix();
    friend std::ostream& operator<<  (std::ostream&, Matrix<T>&);
    Matrix& operator=(Matrix<T>& rhs);
    void init_matrix();
    int count_null();
};
 
template <class T>
Matrix<T>::Matrix()
{
    size_col = 0;
    size_row = 0;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
}
//конструктор з параметрами
template <class T>
Matrix<T>::Matrix(int size_row_BuUser, int size_col_BuUser)
{
    size_row = size_col_BuUser;
    size_col = size_row_BuUser;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    std::cout << "Matrix for random enter - 1nMatrix for user enter -2" <<
        std::endl << "Please enter:";
    int l = 1;
    std::cin >> l;
    switch (l)
    {
    case 1:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = rand() % 99;
            }
        break;
    case 2:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                std::cout << "a[" << i << "]" << "[" << j << "]" << "=";
                std::cin >> m_iArr[i][j];
            }
        break;
    }
}
 
template<class T>
Matrix<T>::Matrix(Matrix<T>& init)
{
    if (&m_iArr != 0)
    {
        for (int j = 0; j < size_row; j++)
        {
            delete &m_iArr[j];
        }
        delete[] m_iArr;
    }
    size_row = init.size_row;
    size_col = init.size_col;
    m_iArr = new T*[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    for (int i = 0; i < size_row; i++)
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = init.m_iArr[i][j];
        }
}
 
template<class T>
Matrix<T>::~Matrix()
{
    for (int j = 0; j < size_row; j++)
    {
        delete m_iArr[j];
    }
    delete[] m_iArr;
}
 
template <class T>
std::ostream& operator<<(std::ostream& output, Matrix<T>& matr)
{
    for (int i = 0; i < matr.size_row; i++)
    {
        for (int j = 0; j < matr.size_col; j++)
        {
            output << matr.m_iArr[i][j] << " ";
        }
        output << std::endl;
    }
    output << std::endl;
    return output;
}
 
template<class T>
Matrix<T>& Matrix<T>::operator= (Matrix<T>& matr)
{
    if (this != &matr)
    {
        for (int j = 0; j < size_row; j++)
            delete m_iArr[j];
        delete[] m_iArr;
 
        size_row = matr.size_row;
        size_col = matr.size_col;
        m_iArr = new T *[size_row];
        for (int i = 0; i < size_row; i++)
        {
            m_iArr[i] = new T[size_col];
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = 0;
            }
        }
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = matr.m_iArr[i][j];
            }
    }
    std::cout << "Operator =" << std::endl;
    return *this;
}
 
template<class T>
void Matrix<T>::init_matrix()
{
 
    for (int j = 0; j < size_row; j++)
        delete m_iArr[j];
    delete[] m_iArr;
 
    std::cout << "enter row:";
    std::cin >> size_row;
    std::cout << "enter col:";
    std::cin >> size_col;
    m_iArr = new T *[size_row];
    for (int i = 0; i < size_row; i++)
    {
        m_iArr[i] = new T[size_col];
        for (int j = 0; j < size_col; j++)
        {
            m_iArr[i][j] = 0;
        }
    }
    std::cout << "Matrix for random enter - 1nMatrix for user enter -2nPlease enter : ";
    int l = 1;
    std::cin >> l;
    switch (l)
    {
    case 1:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                m_iArr[i][j] = rand() % 99;
            }
        break;
    case 2:
        for (int i = 0; i < size_row; i++)
            for (int j = 0; j < size_col; j++)
            {
                std::cout << "a[" << i << "]" << "[" << j << "]" << "=";
                std::cin >> m_iArr[i][j];
            }
        break;
    }
}
template<class T>
int Matrix<T>::count_null()
{
    int count_null = 0;
    for (int i = 0; i < size_row; i++)
        for (int j = 0; j < size_col; j++)
        {
            if (m_iArr[i][j] == 0)
            {
                count_null++;
            }
        }
    std::cout << count_null << std::endl;
    return count_null;
}

Все решил проблему — действительно не нужно реализовывать шаблонные классы по разным файлам . Всем спасибо за ответы



0



Содержание

  1. Unity — Fix for Build Error C2760 in combaseapi.h — but still not working #1550
  2. Comments
  3. Библиотека GDI+ вызывает ошибку C2760: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа» в VS2017 при компиляции для XP
  4. Ответы (4)
  5. Библиотека GDI+ вызывает «ошибку C2760: синтаксическая ошибка: неожиданный токен» идентификатор «, ожидаемый» спецификатор типа «» в VS2017 при компиляции для XP
  6. 4 ответа
  7. Библиотека GDI + вызывает ошибку C2760: синтаксическая ошибка: неожиданный токен «идентификатор», ожидаемый «спецификатор типа» »в VS2017 при компиляции для XP
  8. Как создать проект C++, отличный от MFC, со статической привязкой к библиотекам времени выполнения VC?

Unity — Fix for Build Error C2760 in combaseapi.h — but still not working #1550

Hi, still can’t get the copter working. I did find a fix for the C2670 error though. Any thoughts appreciated.

Win 10 Home
Unity 2018.2.15f1
VS Community 2017 15.8.9
SDK 8.1

Unity/build.cmd Build fails with:
windows kits8.1includeumcombaseapi.h(229): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’

1: Open (make backup first of course) C:Program Files (x86)Windows Kits8.1Includeumcombaseapi.h
2: Add struct IUnknown; // Workaround for «combaseapi.h(229): error C2187: syntax error: ‘identifier’ was unexpected here» when using /permissive-
3: Put this line at top of file above includes
4: Rebuild
5: Build succeeds but with warning:

«..PathAirSimUnityAirLibWrapperAirsimWrapper.sln» (Clean;Build target) (1) ->
«..PathAirSimUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj.metaproj» (default ta
rget) (2:2) ->
«..PathAirSimUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj» (default target) (5:
2) ->
(Link target) ->
LINK : warning LNK4075: ignoring ‘/INCREMENTAL’ due to ‘/LTCG’ specification [..PathAirSi
mUnityAirLibWrapperAirsimWrapperAirsimWrapper.vcxproj]

6: Run project SimModeSelector Unity Project Warning:
Cannot read settings file C:Program FilesUnityEditorsettings.json Vehicle=SimpleFlight
UnityEngine.Debug:LogError(Object)
AirSimUnity.Vehicle:PrintLogMessage(String, String, String, Int32) (at Assets/AirSimAssets/Scripts/Vehicles/Vehicle.cs:279)
AirSimUnity.VehicleCompanion:PrintLogMessage(String, String, String, Int32) (at Assets/AirSimAssets/Scripts/Vehicles/VehicleCompanion.cs:193)

7: Create settings.json file in Assets folder:
<
«SettingsVersion»: 1.2,
«SimMode»: «Multirotor»
>

8: Run Unity Project SimModeSelector. Copter does not respond to Page Up/Down & WASD
Car responds to WASD

The text was updated successfully, but these errors were encountered:

Источник

Библиотека GDI+ вызывает ошибку C2760: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа» в VS2017 при компиляции для XP

Я пытаюсь включить следующие определения для GDI+ в свой проект Win32 C++, скомпилированный в Visual Studio 2017:

Мне нужно скомпилировать этот проект для поддержки Windows XP. Итак, в свойствах проекта я выбрал: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :

Но когда я компилирую его, библиотека GDI+ дает мне это:

Есть идеи, как это исправить?

Ответы (4)

Добавьте эту строку перед самым первым (!) #include заголовком, связанным с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :

Это исправление работает, потому что строка в objbase.h(239) , упомянутая в ошибке, содержит static_cast (*pp); , несмотря на то, что IUnknown еще не был объявлен в этом месте.

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

По сути, мне пришлось понизить весь проект до Visual Studio 2015 — Windows XP (v140_xp) только для того, чтобы скомпилировать одну плохо написанную библиотеку:

Это создало собственную проблему с библиотеками std :

Поэтому мне пришлось шунтировать эти ошибки небезопасных функций:

Что далеко от идеала!

(По сути, вы жертвуете безопасностью приложения только для того, чтобы скомпилировать эту чертову библиотеку GDI+.)

Есть способ заставить это работать, если вы готовы редактировать заголовочные файлы Windows.

В objbase.h закомментируйте строку 239 или измените ее на:

В gdiplusheaders.h , строка 891, удалите лишний квалификатор ( Metafile:: ).

В gdiplusstringformat.h , строка 220, удалите лишний квалификатор ( StringFormat:: ).

Надеюсь, это исправит ситуацию для вас, ничего не сломав.

Хотя вопрос старый, просто добавляю то, что сработало для меня.

В моем случае включение windows.h и компиляция с набором инструментов VS2017 v141_xp вызывали у меня ошибку: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «спецификатор типа».

Источник

Библиотека GDI+ вызывает «ошибку C2760: синтаксическая ошибка: неожиданный токен» идентификатор «, ожидаемый» спецификатор типа «» в VS2017 при компиляции для XP

Я пытаюсь включить следующие определения для GDI+ в мой проект Win32 C++, который скомпилирован в Visual Studio 2017:

Мне нужно скомпилировать этот проект для поддержки Windows XP. Поэтому в свойствах проекта я выбрал: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :

Но когда я компилирую это, библиотека GDI+ дает мне это:

Есть идеи как это исправить?

4 ответа

Добавьте эту строчку перед самым первым (!) #include заголовка, связанного с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :

Это исправление работает, потому что строка в objbase.h(239) упомянутый в ошибке содержит static_cast (*pp); несмотря на то, что IUnknown до сих пор не объявлен в этом месте.

Я вроде получил его для компиляции, но это определенно не хорошее решение. Я опубликую его здесь как временное решение, пока Microsoft не избавится от своих ___ идей. Также, если кто-нибудь найдет лучший способ, пожалуйста, дайте мне знать.

Я в основном должен был понизить весь проект до Visual Studio 2015 — Windows XP (v140_xp) просто скомпилировать одну плохо написанную библиотеку:

Это создало собственную проблему с std библиотеки:

Таким образом, я должен был избежать ошибок небезопасных функций:

Что далеко от идеала!

(Вы в основном жертвуете безопасностью приложения, просто чтобы скомпилировать эту чертову библиотеку GDI+.)

Есть способ заставить это работать, если вы готовы редактировать заголовочные файлы Windows.

В objbase.h закомментируйте строку 239 или измените ее на:

В gdiplusheaders.h , строка 891, удалите лишний квалификатор ( Metafile:: ).

В gdiplusstringformat.h , строка 220, удалите лишний классификатор ( StringFormat:: ).

Надеюсь, это исправит ситуацию, не сломав ничего.

Хотя вопрос старый, просто добавляю то, что сработало для меня.

В моем случае включение windows.h и компиляция с набором инструментов VS2017 v141_xp вызывали у меня ошибку: синтаксическая ошибка: неожиданный «идентификатор» токена, ожидаемый «описатель типа».

Источник

Библиотека GDI + вызывает ошибку C2760: синтаксическая ошибка: неожиданный токен «идентификатор», ожидаемый «спецификатор типа» »в VS2017 при компиляции для XP

Я пытаюсь включить следующие определения для GDI + в свой проект Win32 C ++, который скомпилирован в Visual Studio 2017:

Мне нужно скомпилировать этот проект для поддержки Windows XP. Итак, в выбранном мной проекте свойства: Platform Toolset как Visual Studio 2017 — Windows XP (v141_xp) :

Но когда я его компилирую, библиотека GDI + дает мне следующее:

Есть идеи, как это исправить?

Добавьте эту строку перед самым первым (!) #include Заголовком, связанным с COM, чтобы исправить objbase.h(239): error C2760: syntax error: unexpected token ‘identifier’, expected ‘type specifier’ :

Это исправление работает, потому что строка, objbase.h(239) упомянутая в ошибке, содержит, static_cast (*pp); несмотря на то, что IUnknown еще не был объявлен в этом месте.

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

Мне в основном пришлось понизить версию всего проекта, чтобы Visual Studio 2015 — Windows XP (v140_xp) просто скомпилировать одну плохо написанную библиотеку:

Это создало собственную проблему с std библиотеками:

Поэтому мне пришлось устранить эти ошибки небезопасных функций:

Что далеко не идеально!

(По сути, вы жертвуете безопасностью приложения только для того, чтобы скомпилировать эту чертову библиотеку GDI +.)

Источник

Как создать проект C++, отличный от MFC, со статической привязкой к библиотекам времени выполнения VC?

Я знаю, что для проекта MFC, созданного с помощью Visual Studio, можно перейти в свойства проекта, а затем Configuration Properties -> General -> use of MFC и изменить его на Use MFC in a static library :

Это работает, если полученная сборка должна запускаться в более ранних версиях Windows без необходимости установки DLL времени выполнения MFC или VC. Полученная сборка будет использовать библиотеки DLL, которые уже присутствуют в каждой установке Windows, начиная с Windows 7 и выше. (Возможно, даже до Windows XP.)

Теперь, если я создаю проект без MFC, скажем, тестовое консольное приложение C++, параметр для использования MFC настроен как «Использовать стандартные библиотеки Windows»:

Но если я запустил полученный двоичный файл, скажем, при новой установке Windows 7, я получаю такую ​​ошибку:

Итак, покопавшись в настройках, я не смог найти способ скомпилировать его со статической привязкой ко всем этим новым версиям библиотек VC RT. Он есть, а я его просто не вижу?

PS. Покопавшись дальше, я обнаружил, что могу изменить «Platform Toolset» на Visual Studio 2017 — Windows XP (v141_xp) , предполагая, что это сделает его обратно совместимым с Windows XP и выше:

Но затем, если я его скомпилирую, я получаю следующие ошибки:

В этой части файла ObjBase.h , который не имеет ничего общего с моим тестовым консольным проектом C++, который я только что создал из шаблона Visual Studio:

Итак, мой вопрос: могу ли я создать проект на C++, отличный от MFC, который может работать в более старых версиях Windows без необходимости установки VC Runtime или каких-либо других дополнительных библиотек?

Источник

VC++ 2017 reports C2760 error with this code:

template <typename x>
struct y
{
    static void z()
    {
        using def = typename x::d<0>;
    }
};

struct some
{
    template <int N> struct d;
};

// ... y<some> ...

Compiler output:

my.cpp(6): error C2760: syntax error: unexpected token '<', expected ';'
my.cpp(8): note: see reference to class template instantiation 'y<x>' being compiled

The question is how write def definition inside of y::z?

asked Jul 24, 2018 at 13:55

Raider's user avatar

0

using def = typename x::template d<0>;

The compiler needs to be told that d is a template, otherwise < is interpreted as a less-than operator, not as the opening angle bracket.

answered Jul 24, 2018 at 13:57

Igor Tandetnik's user avatar

Igor TandetnikIgor Tandetnik

49.8k4 gold badges56 silver badges84 bronze badges

VC++ 2017 reports C2760 error with this code:

template <typename x>
struct y
{
    static void z()
    {
        using def = typename x::d<0>;
    }
};

struct some
{
    template <int N> struct d;
};

// ... y<some> ...

Compiler output:

my.cpp(6): error C2760: syntax error: unexpected token '<', expected ';'
my.cpp(8): note: see reference to class template instantiation 'y<x>' being compiled

The question is how write def definition inside of y::z?

asked Jul 24, 2018 at 13:55

Raider's user avatar

0

using def = typename x::template d<0>;

The compiler needs to be told that d is a template, otherwise < is interpreted as a less-than operator, not as the opening angle bracket.

answered Jul 24, 2018 at 13:57

Igor Tandetnik's user avatar

Igor TandetnikIgor Tandetnik

49.8k4 gold badges56 silver badges84 bronze badges

Сообщение об ошибке сообщает вам, что вы можете сделать:

   typename std::map<std::string, _Value>::iterator itr = this->begin();
// ^^^^^^^^^

… но не потому, что вам нужно.

Короче говоря, это причуда C++, относящаяся к шаблонам и так называемым «зависимым именам». Поскольку _Value является параметром шаблона, и поскольку существует специализированная специализация шаблона, C++ не может точно знать, что std::map<std::string, _Value> имеет iterator типа члена, пока немного позже в процессе синтаксического анализа. Таким образом, ваша декларация плохо сформирована, потому что компилятор не может воспринимать ее как декларацию, даже если она скривится. typename говорит, что «это будет тип, я обещаю», а затем все отлично (пока это окажется типом!).

Вы можете подумать, что это должна быть проблема C++, а не ваша, и вы, вероятно, будете правы, но это так, как есть. Вы можете найти дополнительную информацию об этом или просто считать само собой разумеющимся, что, когда компилятор говорит вам написать typename, вы пишете typename.

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

auto itr = this->begin();

Кстати, ваш код подсказывает, что вы используете неправильный контейнер, GetItem должен быть const, вы должны использовать cbegin() not begin() (хотя это для вас сделано, если вы следуете предложению const) и std::advance уже существует…

Понравилась статья? Поделить с друзьями:
  • Error c2712 cannot use try in functions that require object unwinding
  • Error c2679 бинарный не найден оператор принимающий правый операнд типа
  • Error c2679 binary no operator found which takes a right hand operand of type
  • Error c2678 binary no operator found which takes a left hand operand of type
  • Error c2664 in c