【发布时间】:2020-11-17 08:26:37
【问题描述】:
我正在尝试编写一个以不同方式处理不同模板参数的模板类。我希望该类支持两种数据类型:unsigned ints 和 std::strings,仅此而已。该类的行为需要根据它获得的类型而有所不同,因此我在构造函数中进行了一些类型检查。
这是我正在做的精简代码。
#include <iostream>
#include <memory>
#include <utility>
#include <map>
typedef unsigned int uint;
template<typename input_id_t> class atom_t
{
public:
atom_t(input_id_t d) :
data(d)
{ }
const input_id_t data;
};
template<typename input_id_t> using atom_ptr = std::shared_ptr<atom_t<input_id_t>>;
template<typename input_id_t> using atom_map_t = std::map<input_id_t, atom_ptr<input_id_t>>;
template<typename input_id_t> class abstract_t
{
public:
abstract_t()
{
if (typeid(input_id_t).name() == typeid(uint).name())
{
this->base_entry = std::make_shared<atom_t<input_id_t>>(0);
this->a_map->insert(std::pair<input_id_t, atom_ptr<input_id_t>>(0, this->base_entry));
}
else if (typeid(input_id_t).name() == typeid(std::string).name())
{
this->base_entry = std::make_shared<atom_t<input_id_t>>("");
this->a_map->insert(std::pair<input_id_t, atom_ptr<input_id_t>>("", this->base_entry));
}
else { throw "abstract_t template argument invalid!\n"; }
}
atom_ptr<input_id_t> base_entry;
atom_map_t<input_id_t> * a_map = new atom_map_t<input_id_t>;
};
int main()
{
abstract_t<uint> A;
}
我有几个问题。
-
此代码产生的错误如下。我认为它们都与对
std::pair的调用有关,但有什么问题?我注意到删除else if子句可以解决它们。错误:没有用于初始化 'std::pair
' 的匹配构造函数(又名 'pair >') this->a_map->insert(std::pair >("", this->base_entry)); 错误:由于要求 'is_constructible
::value',static_assert 失败 "无法在 make_shared 中构造对象 错误:'atom_t'的初始化没有匹配的构造函数
-
我意识到
typeid(input_id_t).name() == typeid(uint/std::string).name()方法很笨拙。有没有更好的方法来做到这一点?
【问题讨论】:
-
您正在尝试使用
const char*构造一个unsigned int(input_id_t)?
标签: c++ templates compiler-errors