如何摆脱 C++ 中未解析的外部符号“私有:静态字符”错误?

How do I get rid of Unresolved external symbol "private: static char" error in C++?

提问人:Lorand 提问时间:9/11/2018 更新时间:9/12/2018 访问量:1353

问:

我有一种感觉,我在这里错过了一些非常愚蠢的东西,但仍然: 我在正在编写的游戏引擎中出现了这个烦人的“外部符号”错误:

基本上,我想创建一个类来读取某些全局变量中的路径(因此我不必将它们发送到任何地方)。我使用github上的NFD(nativefiledialog)打开文件。在此之前,我直接在 main.cpp 中对其进行了测试,但问题仅在将其放入类中后才发生。

https://github.com/mlabbe/nativefiledialog

路径.h

#pragma once
#include <iostream>
#include <nfd.h>

namespace RW {
    class Paths {
    private:
        static nfdchar_t *gamePath;
        static nfdresult_t result;
    public:
        static void chooseGamePath();
    };
}

路径.cpp

#include "Paths.h"

namespace RW {
    nfdchar_t Paths::*gamePath = NULL;
    nfdresult_t Paths::result;

    void Paths::chooseGamePath()
    {
        result = NFD_OpenDialog(NULL, NULL, &gamePath);;
        std::cout << "Please choose the location of the warcraft's exe file!" << std::endl;

        if (result == NFD_OKAY) {
            std::cout << "Success!" << std::endl;
            std::cout << gamePath << std::endl;
            free(gamePath);
        }
        else if (result == NFD_CANCEL) {
            std::cout << "User pressed cancel." << std::endl;
        }
        else {
            std::cout << "Error: " << NFD_GetError() << std::endl;
        }
    }
}

错误:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol "private: static char * RW::Paths::gamePath" (?gamePath@Paths@RW@@0PADA) Half-an Engine  D:\Programozás\Repositories\Warcraft-II-HD\Half-an Engine\Paths.obj 1   
C++ 编译器错误未 解决外部

评论

0赞 Remy Lebeau 9/11/2018
带有静态指针的 C++ 类的可能重复项
0赞 aaron 9/11/2018
您确定正在编译 Paths.cpp 吗?当我将其复制/粘贴到单个文件中时,它工作正常
1赞 Lorand 9/11/2018
@aaron是的。如果你没有在类中运行它,它就可以正常工作,但我很确定它正在被编译,因为 VIsual Studio 是这么说的。无论如何,Remy Lebeau 已经解决了这个问题(至少对我来说是这样)。

答:

2赞 Remy Lebeau 9/11/2018 #1

在 cpp 文件中,以下行:

nfdchar_t Paths::*gamePath = NULL;

声明一个指向成员的指针,该指针只能指向类型为 的类的成员。gamePathPathsnfdchar_t

但这不是你在班级中声明的成员。您将其声明为一个简单的(静态)指针。gamePathPathsnfdchar_t*

将该行改为:

nfdchar_t* Paths::gamePath = NULL;

它声明了一个名为该变量的变量,该变量是该类的成员,其类型为 。这与您在类声明中的声明相匹配。gamePathPathsnfdchar_t*gamePathPaths

评论

0赞 Lorand 9/11/2018
谢谢。我有一种感觉,修复会像这样愚蠢:))。无论如何,我想知道......这两个声明有什么不一样?
0赞 SergeyA 9/11/2018
@SzokeLori第二个版本定义了你要查找的内容,即类的成员变量,其类型为 。第二个定义指向类型为 的类的任何成员变量的指针。换句话说,第二个是成员指针,而第一个是指向成员的指针。Pathnfdchar_t*Pathnfdchar_t
1赞 Lightness Races in Orbit 9/12/2018
这就是右对齐星号的问题。右对齐狂热者列出了几个左对齐与语法相冲突的晦涩情况,但像这个问题这样的例子做同样的事情,而且更常见/明显。左对齐!