【问题标题】:C++ compile errors when using template in unordered_map在 unordered_map 中使用模板时 C++ 编译错误
【发布时间】:2020-03-23 16:27:44
【问题描述】:

我正在尝试在我的项目中使用 unordered_map。与我的问题相关的代码是

#include <bitset>
#include <unordered_map>

struct Node
{};

struct Node_IB
{};

struct Grid
{
    std::unordered_map< std::bitset<64>, Node> grid;
};

struct Grid_IB
{
    std::unordered_map< std::bitset<64>, Node_IB> grid;
};


template <class T_grid, class T_node>
void func1(T_grid &grid_ptr, T_node node_temp);

int main()
{
    Grid grid_ptr1;
    Grid_IB grid_ptr2;

    int ilevel = 1;
    if (ilevel == 1)
    {
        Node_IB node_temp;
        func1(grid_ptr1, node_temp);
    }
    else
    {
        Node node_temp;
        func1(grid_ptr2, node_temp);
    }
}

template <class T_grid, class T_node>
void func1(T_grid &grid_ptr, T_node node_temp)
{
    std::bitset<64> key = 0;
    grid_ptr.grid.insert(make_pair(key, node_temp));
} 

错误是“错误 C2664: 'std::_List_iterator>> std::_Hash,_Alloc,false>>::insert(std::_List_const_iterator>>,const std::pair &)': 无法转换参数1 从 'std::pair,Node>' 到 'std::pair &&'"

我尝试在另一个函数 (func_manager) 中调用 func1 并遇到了同样的问题。我对模板实例化感到困惑?这个程序有什么限制吗?

#include <bitset>
#include <unordered_map>

struct Node
{};

struct Node_IB
{};

struct Grid
{
    std::unordered_map< std::bitset<64>, Node> grid;
};

struct Grid_IB
{
    std::unordered_map< std::bitset<64>, Node_IB> grid;
};


template <class T_grid, class T_node>
void func1(T_grid &grid_ptr, T_node node_temp);

template <class T_gr>
void func_manager(T_gr &grid_ptr, int ilevel);

int main()
{
    Grid_IB grid_ptr1;
    Grid grid_ptr2;

    int ilevel = 1;
    if (ilevel == 1)
    {
        func_manager<Grid_IB>(grid_ptr1, ilevel);
    }
    else
    {
        func_manager<Grid>(grid_ptr2, ilevel);
    }

}

template <class T_gr>
void func_manager(T_gr &grid_ptr, int ilevel)
{

    if (ilevel == 1)
    {
        Node_IB node_temp;
        func1(grid_ptr, node_temp);
    }
    else
    {
        Node node_temp;
        func1(grid_ptr, node_temp);
    }

}


template <class T_grid, class T_node>
void func1(T_grid &grid_ptr, T_node node_temp)
{
    std::bitset<64> key = 0;
    grid_ptr.grid.insert(make_pair(key, node_temp));
}

我是代码开发的新手。对于任何令人困惑的信息,我们深表歉意。

谁能帮我解决这个问题?

谢谢

【问题讨论】:

  • 请提供minimal reproducible example。例如,这段代码无法编译,grid_ptrmain 中使用但尚未声明。
  • 很抱歉给您带来不便。我重新编辑了代码。

标签: c++11 templates


【解决方案1】:

像这样改变你的主函数,它将被编译。

struct Node
{
};

struct Node_IB
{
};

struct Grid
{
   std::unordered_map< std::bitset<64>, Node> grid;
};

struct Grid_IB
{
   std::unordered_map< std::bitset<64>, Node_IB> grid;
};


template <class T_grid, class T_node>
void func1(T_grid &grid_ptr, T_node node_temp);

template <class T_gr, class T_node>
void func_manager(T_gr &grid_ptr, T_node & node_temp, int ilevel);

int main()
{
   Grid_IB grid_ptr1;
   Grid grid_ptr2;

   Node_IB node_ib;
   Node  node;

   int ilevel = 1;
   if (ilevel == 1)
   {
      func_manager<Grid_IB, Node_IB>(grid_ptr1, node_ib, ilevel);
   }
   else
   {
      func_manager<Grid, Node>(grid_ptr2, node, ilevel);
   }

}

template <class T_gr, class T_node>
void func_manager(T_gr &grid_ptr, T_node & node_temp, int ilevel)
{

   if (ilevel == 1)
   {
      func1(grid_ptr, node_temp);
   }
   else
   {
      func1(grid_ptr, node_temp);
   }

}


template <class T_grid, class T_node>
void func1(T_grid &grid_ptr, T_node node_temp)
{
   std::bitset<64> key = 0;
   grid_ptr.grid.insert(std::make_pair(key, node_temp));
}

【讨论】:

  • 感谢您的帮助。是否可以通过在func_manager 中实例化相同的参数grid_ptrfunc1 中实例化grid_ptr,正如我在我的问题中重新编辑的那样?
  • 你当前版本代码的问题是在你的func_manager方法中,ilevel 的值是在运行时确定的,但是你需要先在编译时编译你的方法!!!在 C++17 中,您可以使用 if constexpr(...) 来编写这样的代码,但在 C++11 中,您不能使用它。我已经更新了我的答案来解决你的问题 n C++11。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 2016-06-05
相关资源
最近更新 更多