Ошибка компоновщика из-за «__cdecl» и & quot; __ thiscall & quot; Несоответствие соглашения о вызовах при использовании MFC?

Я использую Visual Studio 2008. Я получаю ошибку компоновщика при создании проекта, который содержит статически связанную библиотеку только при использовании MFC CString (vs std :: wstring).

Так что это работает:

//header
class FileProcessor
{
public:
class iterator;
friend class iterator;
//...

class iterator : public std::iterator<std::input_iterator_tag, std::vector<std::vector<std::wstring>>>
{
public:
//...
std::vector<std::vector<std::wstring>> operator*() const;
}
}//cpp
std::vector<std::vector<std::wstring>> FileProcessor::iterator::operator*() const
{
return _outerRef->_pimpl->_saxHandler->GetCurrentTable();
}

Но это

//header
#include <afx.h>

class FileProcessor
{
public:
class iterator;
friend class iterator;
//...

class iterator : public std::iterator<std::input_iterator_tag, std::vector<std::vector<CString>>>
{
public:
//...
std::vector<std::vector<CString>> operator*() const;
}
}//cpp
std::vector<std::vector<CString>> FileProcessor::iterator::operator*() const
{
return _outerRef->_pimpl->_saxHandler->GetCurrentTable();
}

выдает ошибку компоновщика:

FileProcessingTests.obj : error LNK2019: unresolved external symbol "public: class
std::vector<class std::vector<class std::basic_string<wchar_t,struct
std::char_traits<wchar_t>,class std::allocator<wchar_t> >,class std::allocator<class
std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class
std::allocator<wchar_t> > > >,class std::allocator<class std::vector<class
std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class
std::allocator<wchar_t> >,class std::allocator<class std::basic_string<wchar_t,struct
std::char_traits<wchar_t>,class std::allocator<wchar_t> > > > > > __thiscall
FileProcessing::FileProcessor::iterator::operator*(void)const "(??Diterator@FileProcessor@FileProcessing@@QBE?AV?$vector@V?$vector@V?$basic_string@_WU?
$char_traits@_W@std@@V?$allocator@_W@2@@std@@V?$allocator@V?$basic_string@_WU?$char_traits
@_W@std@@V?$allocator@_W@2@@std@@@2@@std@@V?$allocator@V?$vector@V?$basic_string@_WU?$
char_traits@_W@std@@V?$allocator@_W@2@@std@@V?$allocator@V?$basic_string@_WU?$char_traits
@_W@std@@V?$allocator@_W@2@@std@@@2@@std@@@2@@std@@XZ) referenced in function "void
__cdecl TestUnicodeSingleTable(void)" (?TestUnicodeSingleTable@@YAXXZ)

В обоих проектах соглашение о вызовах указано как __cdecl в файле проекта. Так почему же __thiscall даже возникающий, и как я могу это исправить? Я должен использовать __cdecl потому что я ссылаюсь на внешние библиотеки, которые используют __cdecl,

Дополнительные настройки проекта:

Оба проекта имеют следующие параметры конфигурации:

  • «Использование MFC»: использование MFC в общей библиотеке DLL
  • «Использование ATL»: не использовать ATL
  • «Набор символов»: используйте набор символов Unicode

4

Решение

Это выглядит как FileProcessingTests.cpp не перестраивается или использует устаревший заголовок. Этот объектный файл все еще пытается связаться с std::wstring вариант, а не CString вариант.

Сообщение об ошибке является подробным способом сказать, что неразрешенный внешний символ предназначен для:

std::vector<std::vector<std::wstring>> FileProcessor::iterator::operator*() const

Имейте в виду, что std::wstring это просто typedef для:

class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >

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

0

Другие решения

От MSDN:

Соглашение о вызовах __thiscall используется для функций-членов и
соглашение о вызовах по умолчанию, используемое функциями-членами C ++, которые делают
не использовать переменные аргументы.

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

Я предлагаю попробовать добавить __cdecl для методов, с которыми у вас есть проблемы, чтобы увидеть, что происходит.

0

По вопросам рекламы [email protected]