gpt4 book ai didi

c++ - basic_string 不允许在它声明的地方之外定义

转载 作者:行者123 更新时间:2023-11-30 02:04:51 33 4
gpt4 key购买 nike

好吧,我对这个错误有点困惑。我在这里要做的是创建一个 basic_string,当定义了 UNICODE 和 _UNICODE 时,它可以是 char 或 wchar_t(这是在 WINAPI 中)。这确实有效,但出于某种原因,我无法定义一个在声明它的类之外接收 std::basic_string 的函数。这是一个例子:

测试.h

#ifndef TEST_H
#define TEST_H

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

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

#endif

测试.cpp

#include "test.h"

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

这会产生一个链接错误,声称 test::func 从未被定义。但是,如果我只是像这样在类中定义:

测试.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 时。所以这是我的主要内容,错误很快......

主要.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

任何人都知道发生了什么以及我该如何解决这个问题?

最佳答案

我想是因为你把#define UNICODE放在了main.cpp里,其他部分不知道这个。编译test.cpp时,UNICODE没有定义。您可以尝试将 UNICODE 定义作为项目处理器宏。或者在test.h中,在包含Windows.h之前写上#define UNICODE#define _UNICODE

另一方面,因为您已经将 Windows.h 包含在 Test.h 中,所以您不应该将它再次包含在 main.cpp 中。

考虑在 visual studio 中创建一个默认项目,并使用 Precompiled Headers。这样,将此类包含在 stdafx.h 中将解决您的所有问题:

#define UNICODE
#include <windows.h>
#include <string>

关于c++ - basic_string<TCHAR> 不允许在它声明的地方之外定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10059221/

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