在尝试测试我从头开始制作的Graph ADT时,编译失败并带有
Undefined symbols for architecture x86_64:
"Graph<Region>::order()", referenced from:
creates_a_connected_graph_graph_Test::TestBody() in graph.test.cpp.o
我已经在SO上寻找解决方案,但是大多数都指向一个与实现不同的定义(标题与.cpp),或者是特定于案例的。我是C ++的新手,所以我不知道如何继续这个。
这是错误的代码:
Graph.h
template <class E>
class Graph {
public:
Graph<E>(std::vector<std::pair<string, std::shared_ptr<E>>> nodes, std::vector<std::pair<string, string>> edges);
std::size_t order();
// ...
private:
const std::unordered_map<string, std::pair<std::shared_ptr<E>, short>> m_nodes;
// ...
}
Graph.cpp
template <class E>
Graph<E>::Graph(
std::vector<std::pair<string, std::shared_ptr<E>>> nodes,
std::vector<std::pair<string, string>> edges) {
for(const auto& node : nodes){
addNode(std::get<0>(node), std::get<1>(node));
}
for(const auto& edge : edges){
addEdge(std::get<0>(edge), std::get<1>(edge));
}
};
/**
* Returns the number of nodes in the Graph
*/
template <class E>
std::size_t Graph<E>::order() { return m_nodes.size(); };
Graph.test.cpp
TEST(creates_a_connected_graph, graph){
using search_set = std::set<string>;
using forest_map = std::unordered_map<string, std::pair<string, string>>;
std::shared_ptr<Graph> g = loadGraph("./graph.json");
const size_t order = g->order();
const size_t dfs_order = algorithm::dfs<Region>(
"r1",
[](const string&, const search_set&, const forest_map&) -> bool { return true; }
)(*g);
ASSERT_EQ(order, dfs_order);
};
环境:
-std=c++14