Пожалуйста, помогите найти ошибку(LNK2001) с++

206
25 марта 2018, 21:36

Пожалуйста, помогите найти ошибку(LNK2001) в коде:

#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
class Graph
{
    static std::unordered_map<std::string, std::vector<std::string>> graph;
    Graph(){}
public:
    static bool set(const std::string& f, const std::string& s)
    {
        if (graph.find(s) == graph.end())
        {
            if (graph.find(f) != graph.end())
            {
                graph.at(f).push_back(s);
            }
            else
            {
                graph.insert(std::make_pair(f, std::vector<std::string>(0, s)));
            }
            graph.insert(std::make_pair(s, std::vector<std::string>()));
            return true;
        }
        return false;
    }
    static bool set(std::vector<std::string>& v, const std::string& s)
    {
        if (graph.find(s) == graph.end())
        {
            for (auto& f : v)
            {
                if (graph.find(f) != graph.end())
                {
                    graph.at(f).push_back(s);
                }
                else
                {
                    graph.insert(std::make_pair(f, std::vector<std::string>(0, s)));
                }
            }
            graph.insert(std::make_pair(s, std::vector<std::string>()));
            return true;
        }
        return false;
    }
    static void read()
    {
        for (auto a : graph)
        {
            std::cout << a.first << ":\n";
            for (auto v : a.second)
            {
                std::cout <<"\t"<< v << "\n";
            }
        }
    }
    static bool is_base_of(std::string &f, std::string &s)
    {
        //...
    }
};
int main()
{
    Graph::set("Base", "wer");
    system("pause");
}

Я думаю, что это проблема как-то связана с контейнером map или с ссылками, но все равно возникает ошибка, как бы код не переписывал.

Answer 1

Конкретная ошибка, о которой спрашиваете - статический член graph надо не только объявить, но и определить - т.е. вне класса написать

std::unordered_map<std::string, std::vector<std::string>> Graph::graph;

Ну, о том, что нет смысла использовать класс вместо пространства имен, вам уже написал @ARHovsepyan.

Answer 2
namespace Graph
{
    std::unordered_map<std::string, std::vector<std::string>> graph;
    bool set(const std::string& f, const std::string& s)
    {
          if (graph.find(s) == graph.end())
          {
              if (graph.find(f) != graph.end())
              {
                  graph.at(f).push_back(s);
              }
              else
              {
                  graph.insert(std::make_pair(f, std::vector<std::string>(0, s)));
              }
              graph.insert(std::make_pair(s, std::vector<std::string>()));
              return true;
          }
          return false;
      }
    bool set(std::vector<std::string>& v, const std::string& s);
    void read();
    bool is_base_of(std::string &f, std::string &s);
}
int main()
{
    Graph::set("Base", "wer");
    //...
}

Так как кроме статических поля и функции в классе у вас ничего нет, и обьект не позволяете создавать, пространство имен будет выглядеть лучше и не будет ошибки компиляции, даже если вы определили только Graph::set(const std::string& , const std::string&)

READ ALSO
Консольная псевдографика в линуксе

Консольная псевдографика в линуксе

В windows есть библиотека для консольной графики: windowsh

182
Расчет Line of Sight в географической системе между двумя точками

Расчет Line of Sight в географической системе между двумя точками

Существует ли библиотека для расчета Line of Sight (LOS) между двумя точками на карте, указывая координаты, на C++? Есть ли данный способ в GeographicLib? Искал,...

164
Создание библиотеки

Создание библиотеки

Не получается подключить библиотеку с функциямиУ меня должны быть: программа

166
Подгрузка модулей интерпретатора

Подгрузка модулей интерпретатора

Доброго! Заинтересовался разработкой интерпретатора name языка программированияНашел довольно неплохой "курс", где в десятке уроков он [интерпретатор]...

205