Я использую 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
,
Дополнительные настройки проекта:
Оба проекта имеют следующие параметры конфигурации:
Это выглядит как 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
явно, поэтому сообщение об ошибке имеет такой ужасный выброс.
От MSDN:
Соглашение о вызовах __thiscall используется для функций-членов и
соглашение о вызовах по умолчанию, используемое функциями-членами C ++, которые делают
не использовать переменные аргументы.
Таким образом, __thiscall является соглашением о вызовах по умолчанию для методов. Это может быть проблемой.
Я предлагаю попробовать добавить __cdecl для методов, с которыми у вас есть проблемы, чтобы увидеть, что происходит.