Пожалуйста, помогите найти ошибку(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 или с ссылками, но все равно возникает ошибка, как бы код не переписывал.
Конкретная ошибка, о которой спрашиваете - статический член graph
надо не только объявить, но и определить - т.е. вне класса написать
std::unordered_map<std::string, std::vector<std::string>> Graph::graph;
Ну, о том, что нет смысла использовать класс вместо пространства имен, вам уже написал @ARHovsepyan.
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&)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Существует ли библиотека для расчета Line of Sight (LOS) между двумя точками на карте, указывая координаты, на C++? Есть ли данный способ в GeographicLib? Искал,...
Не получается подключить библиотеку с функциямиУ меня должны быть: программа
Доброго! Заинтересовался разработкой интерпретатора name языка программированияНашел довольно неплохой "курс", где в десятке уроков он [интерпретатор]...