C++编译错误: no matching constructor for initialization

标签 c++ shared-ptr

我在编译 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_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_CXX_FLAGS 中,以查看是否可以获得编译错误的堆栈跟踪之类的内容,但无济于事。这很可能是重复的。如果您知道如何解决这个问题,那就太好了;如果您知道一种方法来获取类似编译错误的堆栈跟踪错误,那么您将是我的救星<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++编译错误: no matching constructor for initialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989320/

相关文章:

c++ - 检查元素是否存在

c++ - fseek 没有读取所有数据?

c++ - 了解当传递给函数时,shared_ptr 引用计数何时增加

c++ - 共享指针是怎么回事?

c++ - SDL2 错误我在做什么 错了

部分数据的 C++ 正则表达式

c++ - 为什么共享指针修改后要失效?

c++ - 将 std::shared_ptr 的容器 ( std::vector ) 过滤为 std::weak_ptr 的容器

C++:auto_ptr + 前向声明?

c++ - 有没有办法嵌入Windows保存对话框