类模板

时间:2019-02-08 19:57:19

标签: c++

我将std :: map用作模板类中的受保护成员。模板参数之一用作键,另一个用作其值。 在移动构造函数中,我尝试放置一个对(键和值)。这将产生以下编译错误:no matching function for call 'std::pair<keyType, valueType>::pair(keyType, valueType)'

İ尝试使用替代方法向映射中添加std :: pair,例如insert和operator []。它们产生不同的编译错误。但是,似乎我缺少有关模板的一些信息。

以下是产生错误的代码段:

//template.tpp  
template <typename E, typename S, typename D>
class Base
{
public:
    Base(S&& state);
    Base(S&& state, D&& data);

protected:
    std::map<E,S> m_states;
    E m_current_state;
    D m_data;
};

template <typename E, typename S, typename D>
Base<E, S, D>::Base(S&& state) : m_current_state(state.identifier()) {
    m_states.emplace(std::make_pair(std::move(state.identifier()), std::move(state)));
}
...

//derived.h
template class Base<Status, State, Data>;

class Derived : public QObject, public Base<Status, State, Data>
{
    Q_OBJECT
public:
    Derived::Derived(State&& state, QObject* parent = nullptr);
...
};

//derived.cpp
Derived::Derived(State&& state, QObject* parent) :
        Base<Status, State, Data>(std::move(state)), QObject(parent) {}

State是从模板化基类派生的类。

template <typename E, typename D>
class BaseState {
...
}

class State : public QObject, public BaseState<Status, Data>
{
     Q_OBJECT
...
}

Status类是一个枚举

enum class Status : unsigned int {invalid, valid, error};

为什么会出现编译错误:

no matching function for call 'std::pair<Status, State>::pair(Status, State)' 
return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));

stl_pair.h: template argument deduction/substitution failed: mismatched types 'std::tuple<_Tps ...>' and 'Status'

如果我删除了m_states.emplace(...,代码就会编译。我在这里想念什么?

0 个答案:

没有答案