C++ compilation error: no matching constructor for initialization
C++ compilation error: no matching constructor for initialization
我在编译 C++ 时遇到问题。即,我从 header:
得到以下模糊错误
In file included from .../map.test.cpp:1:
/Library/Developer/CommandLineTools/usr/include/c++/v1/memory:2172:15: error: no matching constructor for initialization of
'SmallWorld::Map::Graph<SmallWorld::Region>'
__second_(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
有问题的代码如下:
#include <memory>
#include <string>
#include <gtest/gtest.h>
#include "../../../app/Domain/Map/loader.cpp"
using std::string;
TEST(creates_a_connected_graph, small_world_map){
using SmallWorld::Region;
using Graph = SmallWorld::Map::Graph<Region>;
using search_set = std::set<string>;
using forest_map = std::unordered_map<string, std::pair<string, string>>;
std::shared_ptr<Graph> g = SmallWorld::Map::loadMap("./map.json");
const size_t order = g->order();
const size_t dfs_order = SmallWorld::Map::algorithm::dfs<Region>(
"r1",
[](const string&, const search_set&, const forest_map&) -> bool { return true; }
)(*g);
ASSERT_EQ(order, dfs_order);
};
故障线最有可能出现在 shared_ptr 实例化处。对 loadMap 的调用调用了以下函数:
std::shared_ptr<Map::Graph<Region>> loadMap(const string& path, const string& schema = "./map.ajv.json") {
using Graph = SmallWorld::Map::Graph<Region>;
using region_ptr = std::shared_ptr<Region>;
json* map = readMap(path, schema);
std::vector<std::pair<string, region_ptr>> regions = extractRegions(*map);
std::vector<std::pair<string, string>> edges = extractEdges(*map);
std::shared_ptr<Graph> pgraph = std::make_shared<Graph>(new Graph(regions, edges));
delete map;
return pgraph;
};
还有我唯一的 user-defined 图的构造函数 class:
Graph<E>(std::vector<std::pair<string, std::shared_ptr<E>>> nodes, std::vector<std::pair<string, string>> edges);
设置:
- OS: MacOS 10.13.3
- C++版本:14
- 编译器: g++ => Apple LLVM 版本 9.0.0 (clang-900.0.39.2)
我已将详细标志添加到我的 CMAKE_CXX_FLAGS 中,以查看是否可以获得编译错误的堆栈跟踪之类的信息,但无济于事。这很可能是重复的。如果您知道如何解决这个问题,那就太好了;如果你知道一种方法来获取 stack-trace 之类的编译错误错误,你就是我的救星 <3
使用 std::make_shared<Graph>
的方式与使用 new Graph
的方式相同,因为它必须是:
std::make_shared<Graph>(regions, edges);
std::make_shared<Graph>(new Graph(regions, edges));
就好像你会写 new Graph( new Graph(regions, edges) )
。
您可能已经看到并表示 std::shared_ptr<Graph>(new Graph(regions, edges));
,但您不应使用该结构。
我在编译 C++ 时遇到问题。即,我从 header:
得到以下模糊错误In file included from .../map.test.cpp:1:
/Library/Developer/CommandLineTools/usr/include/c++/v1/memory:2172:15: error: no matching constructor for initialization of
'SmallWorld::Map::Graph<SmallWorld::Region>'
__second_(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...)
有问题的代码如下:
#include <memory>
#include <string>
#include <gtest/gtest.h>
#include "../../../app/Domain/Map/loader.cpp"
using std::string;
TEST(creates_a_connected_graph, small_world_map){
using SmallWorld::Region;
using Graph = SmallWorld::Map::Graph<Region>;
using search_set = std::set<string>;
using forest_map = std::unordered_map<string, std::pair<string, string>>;
std::shared_ptr<Graph> g = SmallWorld::Map::loadMap("./map.json");
const size_t order = g->order();
const size_t dfs_order = SmallWorld::Map::algorithm::dfs<Region>(
"r1",
[](const string&, const search_set&, const forest_map&) -> bool { return true; }
)(*g);
ASSERT_EQ(order, dfs_order);
};
故障线最有可能出现在 shared_ptr 实例化处。对 loadMap 的调用调用了以下函数:
std::shared_ptr<Map::Graph<Region>> loadMap(const string& path, const string& schema = "./map.ajv.json") {
using Graph = SmallWorld::Map::Graph<Region>;
using region_ptr = std::shared_ptr<Region>;
json* map = readMap(path, schema);
std::vector<std::pair<string, region_ptr>> regions = extractRegions(*map);
std::vector<std::pair<string, string>> edges = extractEdges(*map);
std::shared_ptr<Graph> pgraph = std::make_shared<Graph>(new Graph(regions, edges));
delete map;
return pgraph;
};
还有我唯一的 user-defined 图的构造函数 class:
Graph<E>(std::vector<std::pair<string, std::shared_ptr<E>>> nodes, std::vector<std::pair<string, string>> edges);
设置:
- OS: MacOS 10.13.3
- C++版本:14
- 编译器: g++ => Apple LLVM 版本 9.0.0 (clang-900.0.39.2)
我已将详细标志添加到我的 CMAKE_CXX_FLAGS 中,以查看是否可以获得编译错误的堆栈跟踪之类的信息,但无济于事。这很可能是重复的。如果您知道如何解决这个问题,那就太好了;如果你知道一种方法来获取 stack-trace 之类的编译错误错误,你就是我的救星 <3
使用 std::make_shared<Graph>
的方式与使用 new Graph
的方式相同,因为它必须是:
std::make_shared<Graph>(regions, edges);
std::make_shared<Graph>(new Graph(regions, edges));
就好像你会写 new Graph( new Graph(regions, edges) )
。
您可能已经看到并表示 std::shared_ptr<Graph>(new Graph(regions, edges));
,但您不应使用该结构。