Objbase h 239 error c2760

I'm trying to include the following definitions for GDI+ into my Win32 C++ project that is compiled under Visual Studio 2017: #include #include #pragma comment (...

I’m trying to include the following definitions for GDI+ into my Win32 C++ project that is compiled under Visual Studio 2017:

#include <objidl.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")

I need to compile this project to support Windows XP. So in the project properies I selected: Platform Toolset as Visual Studio 2017 - Windows XP (v141_xp):

enter image description here

But when I compile it the GDI+ library gives me this:

1>c:program files (x86)microsoft sdkswindowsv7.1aincludeobjbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusheaders.h(891): error C4596: 'EmfToWmfBits': illegal qualified name in member declaration
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusstringformat.h(220): error C4596: 'GetTrimming': illegal qualified name in member declaration

Any idea how to fix this?

asked Jul 12, 2019 at 22:41

c00000fd's user avatar

1

Add this line before the very first(!) #include of COM-related header to fix objbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier' :

typedef struct IUnknown IUnknown;

This fix works, because the line in objbase.h(239) mentioned in the error contains static_cast<IUnknown*>(*pp); despite that IUnknown still haven’t been declared in that place.

answered Jun 12, 2020 at 17:31

Кое Кто's user avatar

Кое КтоКое Кто

4275 silver badges8 bronze badges

I kinda got it to compile, but this is definitely not a good solution. I’m posting it here as a temp workaround until Microsoft gets their heads out of their ___es. Also if anyone finds a better way, please let me know.

I basically had to downgrade the entire project to Visual Studio 2015 - Windows XP (v140_xp) just to compile one badly written library:

enter image description here

This created a problem of its own with the std libraries:

1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(50): error C4995: 'sprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(53): error C4995: 'vsprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(20): error C4995: 'strcat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(21): error C4995: 'strcpy': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(29): error C4995: 'swprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(30): error C4995: 'vswprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(32): error C4995: 'wcscat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(34): error C4995: 'wcscpy': name was marked as #pragma deprecated

So I had to shunt those errors of unsafe functions:

#pragma warning( push )
#pragma warning( disable: 4995 )
#include <stdio.h>
#include <new>
#include <string>
#pragma warning( pop )

Which is far from ideal!

(You’re basically sacrificing security of the app just to compile that damn GDI+ library.)

answered Jul 13, 2019 at 20:57

c00000fd's user avatar

c00000fdc00000fd

20.2k23 gold badges168 silver badges385 bronze badges

1

There’s a way to get this to work if you’re prepared to edit the Windows header files.

In objbase.h, comment out line 239 or change it to:

static_assert (std::is_base_of <IUnknown *, *pp>::value, "pp must derive from IUnknown");

In gdiplusheaders.h, line 891, remove the redundant qualifier (Metafile::).

In gdiplusstringformat.h, line 220, remove the redundant qualifier (StringFormat::).

Hopefully, that will fix things for you without breaking anything.

answered Jul 13, 2019 at 23:23

Paul Sanders's user avatar

Paul SandersPaul Sanders

22.9k4 gold badges25 silver badges48 bronze badges

1

Although the question is old, just adding what worked for me.

In my case including windows.h and compiling with VS2017 v141_xp toolset was causing me error: syntax error: unexpected token ‘identifier’, expected ‘type specifier’.

This resolved my issue link

answered Jul 15, 2021 at 15:43

Ishwar's user avatar

Содержание

  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 или каких-либо других дополнительных библиотек?

Источник

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

#include <objidl.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")

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

введите здесь описание изображения

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

1>c:program files (x86)microsoft sdkswindowsv7.1aincludeobjbase.h(239): error C2760: syntax error: unexpected token 'identifier', expected 'type specifier'
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusheaders.h(891): error C4596: 'EmfToWmfBits': illegal qualified name in member declaration
1>c:program files (x86)microsoft sdkswindowsv7.1aincludegdiplusstringformat.h(220): error C4596: 'GetTrimming': illegal qualified name in member declaration

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

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

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

введите здесь описание изображения

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

1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(50): error C4995: 'sprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstdio(53): error C4995: 'vsprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(20): error C4995: 'strcat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecstring(21): error C4995: 'strcpy': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(29): error C4995: 'swprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(30): error C4995: 'vswprintf': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(32): error C4995: 'wcscat': name was marked as #pragma deprecated
1>C:Program Files (x86)Microsoft Visual Studio 14.0VCincludecwchar(34): error C4995: 'wcscpy': name was marked as #pragma deprecated

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

#pragma warning( push )
#pragma warning( disable: 4995 )
#include <stdio.h>
#include <new>
#include <string>
#pragma warning( pop )

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

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

person
c00000fd
  
schedule
13.07.2019

holdem_

0 / 0 / 0

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

Сообщений: 21

1

04.05.2019, 22:41. Показов 7072. Ответов 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



5696 / 3134 / 1307

Регистрация: 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

5696 / 3134 / 1307

Регистрация: 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



Понравилась статья? Поделить с друзьями:

Читайте также:

  • Nx license error invalid inconsistent license key or signature 8
  • Nx license error cannot connect to license server system 15
  • Nwz b153f boot error
  • Nw6403 netflix ошибка
  • Nw 6 403 netflix ошибка на телевизоре samsung

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии