4

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 の使用」: 共有 DLL で MFC を使用する
  • 「ATL の使用」: ATL を使用しない
  • 「文字セット」: Unicode 文字セットを使用
4

2 に答える 2

0

MSDNから:

__thiscall 呼び出し規約はメンバー関数で使用され、可変引数を使用しない C++ メンバー関数で使用される既定の呼び出し規約です。

したがって、__thiscall はメソッドのデフォルトの呼び出し規約です。これが問題かもしれません。

問題のあるメソッドに __cdecl を追加して、何が起こるかを確認することをお勧めします。

于 2012-09-10T04:45:06.223 に答える