Remkomplekty.ru

IT Новости из мира ПК
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

C2664 ошибка c

C++ STL набор классов — ошибка компилятора ошибка c2664

Новичок программист здесь пытается решить свою домашнюю работу. Я пытаюсь использовать набор классов STL, но компилятор жалуется на мой код.

Ошибка, которую я получаю от компилятора, заключается в следующем: xmemory(208): ошибка ошибка c2664: ‘Car::Car(константный автомобиля &)’ : невозможно преобразовать параметр 1 из ‘автомобиля *’ в ‘const и автомобиля &’ Причина: не удается преобразовать из ‘Car *’ в ‘const Car’ Ни один конструктор не мог принять тип источника, или разрешение перегрузки конструктора было неоднозначным

Я не уверен, где я ошибаюсь, не могли бы некоторые указать, как моя перегрузка неверна?

3 Ответа

Ошибка, скорее всего, является строкой g.insert(currentCar) в методе carEnters , так как g -это std::set , а не std::set . Либо передайте ссылку на текущий автомобиль ( *currentCar ), либо сделайте так, чтобы гараж содержал указатели на автомобили.

Кроме того, вы можете пожелать передать в g в качестве ссылки, в виде.

В противном случае набор копируется, и вы можете не получить желаемых результатов.

Если вам нужно объяснить, почему для любого из них, добавьте комментарий. Я использовал, чтобы сделать некоторые TAing назад в день. 🙂

Я считаю, что @James находится на правильном пути, но передача *CurrentCar -это не совсем правильный ответ (по крайней мере, IMO). Вместо этого вам следует немного отступить:

Возможно, у вас есть предыдущий опыт работы с Java (или чем-то подобным), где это рутинный, нормальный тип кода для написания. Однако в C++ прямое использование new является (или, по крайней мере, должно быть) довольно необычным. То, что вы почти наверняка хотите взамен, это:

а потом вы будете заполнять поля типа:

Затем, когда вы помещаете свой currentCar в std::set (или что-то еще), вам не нужно будет разыменовывать что-либо, потому что вы начнете с объекта Car , что и ожидалось. В качестве отступления я бы отметил, что когда вы смотрите на автомобиль, вы также создаете объект Car динамически-но вы никогда не удаляете ни один из них, поэтому ваш код утекает из памяти.

Edit: я должен добавить, что есть альтернативы, которые могут быть предпочтительнее. Прямо сейчас вы в основном рассматриваете Car как «тупые данные», с внешним кодом для работы с этими данными. Если вы хотите, чтобы ваш код был «объектно-ориентированным», то почти наверняка было бы лучше переместить код для чтения данных a Car в сам класс, чтобы внешний код просто вызывал эту функцию-член.

Другая возможность состоит в том, чтобы сделать Car неизменяемого объекта. Вместо того чтобы создавать unitialized car, а затем устанавливать соответствующие значения в этом объекте, я бы передал правильные значения конструктору Car и исключил функции-члены, которые вы в настоящее время имеете для изменения этих значений. По крайней мере, для ваших целей не кажется, что вам действительно нужно менять номерной знак автомобиля-очевидно, он должен иметь только один номерной знак, и в этом случае было бы лучше, чтобы ваш код отражал (и применял) это напрямую.

Ваша проблема заключается в том, что ваш набор принимает элементы типа Car , но вы вставляете элементы типа Car* :

В этом случае currentCar является указателем на Car , а g.insert ожидает Car . Есть несколько способов исправить это — вы можете изменить свой набор на использование Car* , хотя ваш перегруженный operator больше не будет работать (вам придется создать функтор, который передается в набор и занимает два Car* секунд). Вы можете изменить currentCar на тип Car . Это приводит к куче копирования, однако. Или вы можете полностью отказаться от currentCar и создать конструктор, который установит все необходимые переменные:

тогда вы можете просто сделать это:

Что на самом деле предпочтительнее того, что вы делаете сейчас, поскольку кто-то может забыть позвонить setTimeDateIn . Это имеет больше смысла для того, чтобы быть вызванным, когда Car построен.

Похожие вопросы:

Я реализую дерево octree в c++ с помощью visual studio. Когда я вызываю функцию сборки, я получаю эту ошибку: ошибка C2664: ‘BuildTree’: не удается преобразовать параметр 5 из ‘overloaded-function’.

Читать еще:  Нет доступа ошибка в данных crc

Имея проблемы с этой ошибкой компилятора, я не могу понять, о чем он стонет. Если кто-то может помочь, я буду очень благодарен. Вот в чем ошибка: Error 1 error C2664.

У меня есть эта структура: #pragma once #include Defines.h #ifndef _COLOR_H_ #define _COLOR_H_ namespace BSGameFramework < namespace Graphics < ref struct Color < public: Color(BYTE r, BYTE g, BYTE.

for (int v = 0; v ::erase(). #typedef DWORD WordNo_t; class CWordList : public CObject < public.

У меня есть приложение C++ для Windows. В Visual Studio я могу изменить конфигурацию компилятора, включая параметры оптимизации (т. е. /O1 /O2 и т. д.). После этого весь мой исходный код будет.

C2664 ошибка c

Answered by:

Question

These are the errors i am getting when i build.

error C2664: ‘CreateWindowExW’ : cannot convert parameter 2 from ‘const char [5]’ to ‘LPCWSTR’

error C2664: ‘UnregisterClassW’ : cannot convert parameter 1 from ‘const char [5]’ to ‘LPCWSTR’

error C2440: ‘=’ : cannot convert from ‘const char [5]’ to ‘LPCWSTR’

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpszCmdLine, int nCmdShow)

wcex.cbSize = sizeof (WNDCLASSEX);

g_hWnd = CreateWindow(g_szClassName, g_szWindowTitle, WS_OVERLAPPEDWINDOW,

300, 50, 640, 480, NULL, NULL, g_hInst, NULL);

while (msg.message != WM_QUIT)

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

return DefWindowProc(hWnd, Msg, wParam, lParam);

Hope someone can tell me whats going on.

Answers

All replies

i am recieving the error:

Error 1 error C2664: ‘SetConsoleTitleW’ : cannot convert parameter 1 from ‘char *’ to ‘LPCWSTR’ c:documents and settingslloyd noonemy documentsvisual studio 2005projectsmonsterprojectmonsterprojectconlib.cpp 69

ive looked it up and im supposed to change it from char * to TCHAR because of unicode or something.

// ConLib complement header file

// Get standard screen and keyboard handles

m_Screen = GetStdHandle (STD_OUTPUT_HANDLE);

m_Keyboard = GetStdHandle (STD_INPUT_HANDLE);

SetTextColor (ConRed | ConGreen | ConBlue);

// sets background color

void ConLib::SetBackgroundColor (WORD Color)

// use bit manipulation to get the colour combinations

if (Color & ConRed)

if (Color & ConGreen)

if (Color & ConBlue)

// Set the color using the combinations from above

SetConsoleTextAttribute (m_Screen, m_TextColor | m_BackgroundColor);

// sets text colour

void ConLib::SetTextColor(WORD Color)

// use bit manipulation to get the color combinations

if (Color & ConRed)

if (Color & ConGreen)

if (Color & ConBlue)

// set the colour using the color combinations from above

SetConsoleTextAttribute (m_Screen, m_TextColor | m_BackgroundColor);

// sets window title

void ConLib::SetTitle( char * Title)

// clears the screen

void ConLib::Clear( void )

FillConsoleOutputAttribute (m_Screen, m_TextColor | m_BackgroundColor, 80*25, Start, &Written);

FillConsoleOutputCharacter (m_Screen, ‘ ‘ , 80*25, Start, &Written);

SetConsoleCursorPosition (m_Screen, Start);

// sets the cursor position

void ConLib::SetPosition(COORD Position)

SetConsoleCursorPosition (m_Screen, Position);

// sends a string to the screen

void ConLib::OutputString ( char * String)

WriteConsole (m_Screen, String, strlen (String), &Written, NULL);

// Reads a string from the keyboard

void ConLib::Read ( char * Buffer, DWORD BufferSize)

ReadConsole (m_Keyboard, Buffer, BufferSize, &Read, NULL);

// gets a key from the keyboard

int ConLib::GetKey ( void )

// get console input

// if input event is a key event see if there is any key pressed

// and return its virtual key code

if (Event.EventType == KEY_EVENT)

As I had previously said, and as you said yourself, you need to use TCHAR.

void ConLib::SetTitle( TCHAR * Title)
<
SetConsoleTitle (Title);
>

To extend this, it’s a good idea to make the argument const (then it becomes a good idea to use the same typedef as the Platform SDK uses). Furthermore, marking the method as const is something I usually do also.

void ConLib::SetTitle( LPCTSTR Title) const
<
::SetConsoleTitle (Title); // :: helps to see that you’re using a global function, hinting at an API
>

If it is not possible for you to use the TCHAR type everywhere, then you will need to convert the types. If this is the case, use #include and the macro A2T (or related). More info: http://msdn2.microsoft.com/en-US/library/87zae4a3.aspx

Читать еще:  Где посмотреть ошибки синего экрана

Finally, _UNICODE is the cause of the use of the «wide character» APIs (the ones taking wchar_t* instead of char*) Note that using wchar_t directly is an unusual practice. When your project uses _UNICODE, TCHAR adapts accordingly.

C2664 ошибка c

Answered by:

Question

These are the errors i am getting when i build.

error C2664: ‘CreateWindowExW’ : cannot convert parameter 2 from ‘const char [5]’ to ‘LPCWSTR’

error C2664: ‘UnregisterClassW’ : cannot convert parameter 1 from ‘const char [5]’ to ‘LPCWSTR’

error C2440: ‘=’ : cannot convert from ‘const char [5]’ to ‘LPCWSTR’

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpszCmdLine, int nCmdShow)

wcex.cbSize = sizeof (WNDCLASSEX);

g_hWnd = CreateWindow(g_szClassName, g_szWindowTitle, WS_OVERLAPPEDWINDOW,

300, 50, 640, 480, NULL, NULL, g_hInst, NULL);

while (msg.message != WM_QUIT)

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

return DefWindowProc(hWnd, Msg, wParam, lParam);

Hope someone can tell me whats going on.

Answers

All replies

i am recieving the error:

Error 1 error C2664: ‘SetConsoleTitleW’ : cannot convert parameter 1 from ‘char *’ to ‘LPCWSTR’ c:documents and settingslloyd noonemy documentsvisual studio 2005projectsmonsterprojectmonsterprojectconlib.cpp 69

ive looked it up and im supposed to change it from char * to TCHAR because of unicode or something.

// ConLib complement header file

// Get standard screen and keyboard handles

m_Screen = GetStdHandle (STD_OUTPUT_HANDLE);

m_Keyboard = GetStdHandle (STD_INPUT_HANDLE);

SetTextColor (ConRed | ConGreen | ConBlue);

// sets background color

void ConLib::SetBackgroundColor (WORD Color)

// use bit manipulation to get the colour combinations

if (Color & ConRed)

if (Color & ConGreen)

if (Color & ConBlue)

// Set the color using the combinations from above

SetConsoleTextAttribute (m_Screen, m_TextColor | m_BackgroundColor);

// sets text colour

void ConLib::SetTextColor(WORD Color)

// use bit manipulation to get the color combinations

if (Color & ConRed)

if (Color & ConGreen)

if (Color & ConBlue)

// set the colour using the color combinations from above

SetConsoleTextAttribute (m_Screen, m_TextColor | m_BackgroundColor);

// sets window title

void ConLib::SetTitle( char * Title)

// clears the screen

void ConLib::Clear( void )

FillConsoleOutputAttribute (m_Screen, m_TextColor | m_BackgroundColor, 80*25, Start, &Written);

FillConsoleOutputCharacter (m_Screen, ‘ ‘ , 80*25, Start, &Written);

SetConsoleCursorPosition (m_Screen, Start);

// sets the cursor position

void ConLib::SetPosition(COORD Position)

SetConsoleCursorPosition (m_Screen, Position);

// sends a string to the screen

void ConLib::OutputString ( char * String)

WriteConsole (m_Screen, String, strlen (String), &Written, NULL);

// Reads a string from the keyboard

void ConLib::Read ( char * Buffer, DWORD BufferSize)

ReadConsole (m_Keyboard, Buffer, BufferSize, &Read, NULL);

// gets a key from the keyboard

int ConLib::GetKey ( void )

// get console input

// if input event is a key event see if there is any key pressed

// and return its virtual key code

if (Event.EventType == KEY_EVENT)

As I had previously said, and as you said yourself, you need to use TCHAR.

void ConLib::SetTitle( TCHAR * Title)
<
SetConsoleTitle (Title);
>

To extend this, it’s a good idea to make the argument const (then it becomes a good idea to use the same typedef as the Platform SDK uses). Furthermore, marking the method as const is something I usually do also.

void ConLib::SetTitle( LPCTSTR Title) const
<
::SetConsoleTitle (Title); // :: helps to see that you’re using a global function, hinting at an API
>

If it is not possible for you to use the TCHAR type everywhere, then you will need to convert the types. If this is the case, use #include and the macro A2T (or related). More info: http://msdn2.microsoft.com/en-US/library/87zae4a3.aspx

Finally, _UNICODE is the cause of the use of the «wide character» APIs (the ones taking wchar_t* instead of char*) Note that using wchar_t directly is an unusual practice. When your project uses _UNICODE, TCHAR adapts accordingly.

C2664 ошибка c

0s
3. Раскрываем стек вызовов через меню View->Call Stack (нажав потом кнопку Addrs) или командой: k
4. Находим в списке (в районе 15-й строки сверху) примерно это. Интересующая строка помечена стрелкой.
5. Вводим команду (адрес подставляется из помеченной строки): dps 0018f358
6. Видим примерно это:
В отмеченной строке — имя процедуры, в квадратных скобках — файл и номер строки. Номер строки, если смотреть этот файл в блокноте, а не в среде VB. И номер строки не инструкции с ошибкой, а следующей за ней.
Правда, это не сама точка вылета, а строка в процедуре верхнего уровня, в которой не оказалось обработчика ошибки. Весь стек вызовов к моменту появления MsgBox уже разрушен. Можно узнать и точку вылета (в статье по ссылке выше написано как), но для этого надо изначально запустить программу из отладчика, и как-то обойти уйму ложных срабатываний исключений, для которых обработчик в программе есть. Всё же лучше чем ничего.

Читать еще:  Как в ворде сделать исправление ошибок

А нумеровать строки и вставлять уйму обработчиков очень уж тяжко. И легко можно что-нибудь сломать, не во всякую процедуру можно вставлять обработчик, блоки try/catch (то есть on error/err.raise) там используются.

Коллеги, простите за нубский вопрос

Есть длл на Д7, некая братская могила, которую писали-корректировали в течение последних 8 лет около 8 человек, и в которой работают регулярно две-три-четыре сотни пользователей, да и поболее может.
Функционал обширнее некуда — документооборот: резолюции, электронное визирование, выполнение, маршруты (внутри — blob’ы, сканирование через twain, рассылка почты, DbTreeView и прочие разные ехлибы).
в проекте 800к текста в pas и 1500к в dfm
А из этой длл вызываются еще 10 других

************************************************
Одна тетя жалуется, что иногда (последних три месяца не было, но вдруг начало) при выходе валится Runtime Error 216 at
У других не возникает (а может, просто жалуются, но если бы массово, заявок бы точно набросали)

Как искать эту 216? Что делает тетя, она не помнит. Да и как упомнишь, функционал-то ого-го, а работает целый день.
ЗЫ: FastMM не подключен.

Коллеги, простите за нубский вопрос

Есть длл на Д7, некая братская могила, которую писали-корректировали в течение последних 8 лет около 8 человек, и в которой работают регулярно две-три-четыре сотни пользователей, да и поболее может.
Функционал обширнее некуда — документооборот: резолюции, электронное визирование, выполнение, маршруты (внутри — blob’ы, сканирование через twain, рассылка почты, DbTreeView и прочие разные ехлибы).
в проекте 800к текста в pas и 1500к в dfm
А из этой длл вызываются еще 10 других

************************************************
Одна тетя жалуется, что иногда (последних три месяца не было, но вдруг начало) при выходе валится Runtime Error 216 at
У других не возникает (а может, просто жалуются, но если бы массово, заявок бы точно набросали)

Как искать эту 216? Что делает тетя, она не помнит. Да и как упомнишь, функционал-то ого-го, а работает целый день.
ЗЫ: FastMM не подключен.

Вот сегодня я такой же баг подчистил:

В качестве клиентской библиотеки для коннекта к FireBird используется «локальный сервер» fb 2.5.*. Внутри проблемной .dll.

После дисконнекта, перед выгрузкой проблемной .dll, следует вызвать процедуру fb_shutdown.
Ну а я не вызывал, т.к. раньше использовалась более древняя версия библиотеки клиентского доступа, и этам это не требовалось.

В итоге, при завершении все и с грохотом падало. Время от времени. Добавил вызов перед выгрузкой, и все стало хорошо.

Создал веб-службу (MSVS 2008, C#, .NET Framework 2.0). На локальной машине, из-под localhost, все работает.

Публикую службу на веб-сервере (Windows Server 2008 R2, IIS 7.5)
Размещаю ее тут: inetpubwwwrootWebServicesAggregators, где WebServices — общая папка для служб, Aggregators — папка для моей службы.
Создаю в IIS пул приложений (.NET Framework v2.0.50727, Integrated). Назначаю этот пул моей службе. Стартую и пул, и службу.
Обращаюсь к службе из браузера на сервере. Получаю ошибку:

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×