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’.
Имея проблемы с этой ошибкой компилятора, я не могу понять, о чем он стонет. Если кто-то может помочь, я буду очень благодарен. Вот в чем ошибка: 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). Назначаю этот пул моей службе. Стартую и пул, и службу.
Обращаюсь к службе из браузера на сервере. Получаю ошибку: