2015-04-06 5 views
0

Я переношу большой объем кода из Visual Studio в проект с включенным unicode mingw, и я столкнулся с этой проблемой. Кажется, что параметры, которые я передаю из производного класса в базовый класс, не совпадают , По крайней мере, это мое предположение. Я подозревал, что проблема с типом LPCSTR Глядя в этот тип в MinGW я получаю происходит некорректно ЬурейеЕВопросы LPCSTR и wchar_t. Ошибка компоновщика из-за несоответствия параметров

typedef CONST CHAR *LPCSTR,*PCSTR; 

Теперь это базовый класс

#ifdef UNICODE 
    CBasePin(
     __in_opt LPCSTR pObjectName,   
     __in CBaseFilter *pFilter,  
     __in CCritSec *pLock,   
     __inout HRESULT *phr,    
     __in_opt LPCWSTR pName,   
     PIN_DIRECTION dir);   
#endif 

Это класс, который наследует от базовый класс и передает параметры базовому классу.

CAsyncOutputPin::CAsyncOutputPin(
    HRESULT * phr, 
    CAsyncReader *pReader, 
    CAsyncIo *pIo, 
    CCritSec * pLock) 
    : CBasePin(
       TEXT("Text Pin"), 
       pReader, 
       pLock, 
       phr, 
       TEXT("Output"), 
       PINDIR_OUTPUT 
      ), 

    m_pReader(pReader), 
    m_pIo(pIo) 
    ,m_bQueriedForAsyncReader(false) //// 
{ 
} 

Это ошибка линкера я получаю в списке инициализации конструктора

undefined reference to `CBasePin::CBasePin(wchar_t const*, CBaseFilter*, CCritSec*, long*, wchar_t const*, _PinDirection)'| 

какие-либо предложения о том, почему я получаю эту ошибку компоновщика. Я немного озадачен, почему это ошибка компоновщика. Я предполагал, что это было несоответствие типа или что-то такое, что оно будет отображаться как ошибка компилятора. Любые предложения о том, как я могу решить эту проблему для Mingw 64bit gcc?

ответ

3

ваш CBasePin имеет параметр LPCSTR pObjectName (который имеет типа const char*) и параметр LPCWSTR pName (whichis типа const wchar_t*) и в вызове к нему вы используете TEXT -macro на гольце-буквальном, так как эти литералы получая L-префикс, делая их const wchar_t*, когда UNICODE определен, поэтому существует несоответствие типа для pObjectName. Если UNICODE не определен, вы получите ту же ошибку, но в pName.

Удалите первый ТЕКСТ, и он должен быть ОК (для UNICODE, который есть).

+0

Спасибо, что сделал трюк –

0

Почему вы используете макрос TEXT? У вас есть один параметр char * и один параметр wchar_t *, и он не может сделать правильную вещь для обоих.

Просто напишите, что вы имеете в виду. Что-то вроде

"Text Pin", ..., L"Output", ... 
Смежные вопросы