1

わかりました、私はこのエラーに少し困惑しています。ここでやろうとしているのは、UNICODE と _UNICODE が定義されている場合 (これは WINAPI にあります)、char または wchar_t のいずれかになる basic_string を作成することです。これは機能しますが、何らかの理由で、宣言されているクラスの外で std::basic_string を受け取る関数を定義できません。次に例を示します。

test.h

#ifndef TEST_H
#define TEST_H

#include <Windows.h>
#include <string>

class Test
{
public:
    void func(std::basic_string<TCHAR> stringInput);
};

#endif

test.cpp

#include "test.h"

void Test::func(std::basic_string<TCHAR> stringInput)
{
    MessageBox(NULL, stringInput.c_str(), TEXT("It works!"), MB_OK);
}

これにより、test::func が定義されていないと主張するリンク エラーが発生します。ただし、次のようにクラス内で定義するだけの場合:

test.h

#ifndef TEST_H
#define TEST_H

#include <Windows.h>
#include <string>

class Test
{
public:
    void func(std::basic_string<TCHAR> stringInput)
    {
        MessageBox(NULL, stringInput.c_str(), TEXT("It works!"), MB_OK);
    }
}

#endif

それは正常に動作します。ただし、再定義エラーを回避し、整理するために、宣言と定義を別々のファイルに保存するのが本当に好きです。しかし、ここにキッカーがあります。以前のように test.cpp で func を定義し、main.cpp で UNICODE と _UNICODE を定義しないと、リンク エラーが発生しません。実際、リンク エラーが発生するのは、TCHAR が wchar_t になったときだけです。だからここに私のメインとエラーがあります...

main.cpp

#define UNICODE       // this won't compile when these are defined
#define _UNICODE

#include <Windows.h>
#include <string>

#include "test.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    Test test;
    test.func(TEXT("wakka wakka"));
    return 0;
}

エラー:

error LNK2019: unresolved external symbol "public: void __thiscall Test::func(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >)" (?func@Test@@QAEXV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@Z) referenced in function _WinMain@16

何が起こっているのか、どうすればこれを修正できるのか、誰にも手がかりがありますか?

4

1 に答える 1

4

あなたが入れているので#define UNICODEmain.cpp他の部分はこれについて知らないと思います。test.cppがコンパイルされるとき、UNICODEは定義されません。UNICODE定義をプロジェクトプロセッサマクロとして配置してみることができます。または、で、 Windows.hを含める前にtest.h書き込みます。#define UNICODE#define _UNICODE

別の注意点として、Test.hにWindows.hを含めたので、main.cppに再度含めるべきではありません。

Visual Studioでデフォルトのプロジェクトを作成し、を使用することを検討してくださいPrecompiled Headers。このように、そのようなインクルードをstdafx.hに入れると、すべての問題に対処できます。

#define UNICODE
#include <windows.h>
#include <string>
于 2012-04-07T23:59:06.320 に答える