无法理解头文件中的静态(内联)

Иве*_*нов -1 c++ static

我已经使用静态很长时间了,但是现在当头文件出现时我有点困惑。

主要问题是这段代码:

#include <iostream>
#include <string>
#include <sstream>
#include <set>
#ifndef WORD_H
#define WORD_H

#include<unordered_map>

class Word
{
private:
    std::string word;
    int k;

    static std::unordered_map<std::string, int> x;
public:

    Word(std::string word) : word(word)
    {
        if (x.find(word) != x.end())
            x.insert({ word , 0 });
        else
        {
            x[word]++;
        }
    }

    std::string getWord() const
    {
        return x.find(this->word)->first;
    }

    int getCount() const
    {
        return x.find(this->word)->second;
    }
    friend bool operator<(const Word& a, const Word& b);
};

bool operator<(const Word& a, const Word& b)
{
    return a.getWord() < b.getWord();
}

#endif

std::ostream& operator<<(std::ostream& out, const Word& w) {
    return out << w.getWord() << " " << w.getCount();
}

void printWordCounts(const std::string& line) {
    std::istringstream lineIn(line);
    std::set<Word> words;
    std::string wordStr;
    while (lineIn >> wordStr) {
        words.insert(Word(wordStr));
    }

    for (Word w : words) {
        std::cout << w << std::endl;
    }
}

int main() {
    std::string line;

    std::getline(std::cin, line);
    printWordCounts(line);

    std::cout << "---" << std::endl;

    std::getline(std::cin, line);
    printWordCounts(line);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道static关键字有问题,但究竟是什么?

此外,错误是我的最爱之一。链接器和 STL 之间的那些错误:

错误 LNK2001 未解析的外部符号“私有:静态类 std::unordered_map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int,struct std::hash< class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,struct std::equal_to<class std::basic_string<char,struct std::char_traits<char> ,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,int> > > Word::x"(?x@Word@@0V?$unordered_map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HU?$hash@V?$basic_string@ DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator @D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std @@H@std@@@2@@std@@A) ConsoleApplication63 C:\Users\Ivo\source\repos\ConsoleApplication63\ConsoleApplication63\ConsoleApplication63.obj 1

我希望有人能给我一个解释。

cig*_*ien 5

您只声明static成员x。您还需要在类外定义它,如下所示:

std::unordered_map<std::string, int> Word::x;
Run Code Online (Sandbox Code Playgroud)

从 c++17 开始,您可以x在类定义中定义如下:

inline static std::unordered_map<std::string, int> x;
Run Code Online (Sandbox Code Playgroud)