代码之家  ›  专栏  ›  技术社区  ›  Philippe Hebert

C++编译错误:没有用于初始化的匹配构造函数

  •  2
  • Philippe Hebert  · 技术社区  · 7 年前

    我在编译C++时遇到了问题。也就是说,我从标题中得到以下模糊错误:

    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\u 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;
        };
    

    以及我唯一的Graph类用户定义构造函数:

    Graph<E>(std::vector<std::pair<string, std::shared_ptr<E>>> nodes, std::vector<std::pair<string, string>> edges);
    

    设置:

    • 操作系统: MacOS 10.13.3
    • C++版本: 14
    • 编译器: g++=>Apple LLVM 9.0.0版(clang-900.0.39.2)

    我已经在CMAKE\u CXX\u标志中添加了verbose标志,以查看是否可以获得类似于编译错误的堆栈跟踪的内容,但没有效果。这很可能是重复的。如果你有办法解决这个问题,那就太好了;如果您知道一种为编译错误获取堆栈跟踪类错误的方法,那么您就是我的救世主<3.

    🚀

    1 回复  |  直到 7 年前
        1
  •  3
  •   t.niese    7 年前

    使用 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)); ,但这是一个不应该使用的构造。