gpt4 book ai didi

c++ - 使用 MFC 时由于 "__cdecl"和 "__thiscall"调用约定不匹配导致的链接器错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:58 27 4
gpt4 key购买 nike

我正在使用 Visual Studio 2008。仅当使用 MFC CString(与 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 的使用”:在共享 DLL 中使用 MFC
  • “使用 ATL”:不使用 ATL
  • “字符集”:使用Unicode字符集

最佳答案

看起来 FileProcessingTests.cpp 没有被重建,或者它使用的是陈旧的 header 。该目标文件仍在尝试链接到 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 的默认模板参数也显式化,这就是错误消息如此可怕的原因。

关于c++ - 使用 MFC 时由于 "__cdecl"和 "__thiscall"调用约定不匹配导致的链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12344524/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com