gpt4 book ai didi

c++ - 类型检查模板参数导致的编译器错误

转载 作者:行者123 更新时间:2023-12-01 15:10:18 24 4
gpt4 key购买 nike

我正在尝试编写一个模板化类,以不同方式处理不同的模板参数。我希望该类支持两种数据类型:unsigned intstd::string,别无其他。该类的行为根据获取的类型而有所不同,因此我在构造函数中进行了一些类型检查。
这是我正在做的简化代码。

#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 '(aka'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()方法很笨重。有一个更好的方法吗?
  • 最佳答案

    问题在于,即使未执行std::string案例的代码仍会被编译,并且您无法构造以“”作为第一个参数的pair<int, atom_ptr<int>>。那就是编译器告诉您的。
    更好的方法是使用模板特化:

    template<typename input_id_t> class abstract_t {};

    template<> class abstract_t<uint> {
    public:
    typedef uint input_id_t;
    abstract_t()
    {
    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));
    }

    atom_ptr<input_id_t> base_entry;
    atom_map_t<input_id_t> * a_map = new atom_map_t<input_id_t>;
    }

    template<> class abstract_t<std::string> {
    public:
    typedef std::string input_id_t;
    abstract_t()
    {
    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));
    }

    atom_ptr<input_id_t> base_entry;
    atom_map_t<input_id_t> * a_map = new atom_map_t<input_id_t>;
    }

    关于c++ - 类型检查模板参数导致的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63124939/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com