【发布时间】:2017-01-06 13:24:03
【问题描述】:
我正在尝试创建一个基类来存储信号(以int 的形式)并允许我稍后使用它们来调用派生类指定的函数。它们存储在unordered_map 中,因为这正是我所需要的——1 个信号 = 1 个函数(而且速度很快)。
不过,我在给他们打电话时遇到了一些麻烦,收到了以下形式的巨大错误:
对‘(
std::unordered_map<int, std::function<void()>, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<const int, std::function<void()> > > >::mapped_type{akastd::function<void()>})(int&, int&)’的调用不匹配
编译错误来自signals_[_sig](args...);
const int SIGCHANGE = 1;
template<typename... Args>
class Signal {
private:
std::unordered_map< int, std::function<void(Args...)> > signals_;
inline void SetSignal(const int& _sig, std::function<void(Args...)> _func) {
signals_[_sig] = _func;
}
public:
Signal() {}
~Signal() {}
template<typename... Ts>
void Sig(const int& _sig, Ts... args) {
if (signals_.find(_sig) != signals_.end()) {
signals_[_sig](args...);
}
}
};
class Obj : public Signal<> {
private:
int num_;
public:
Obj* child;
void Change(int _num) {
num_ = _num;
child->Sig(SIGCHANGE, _num);
}
void HandleChanged(int _num) {
num_ = _num;
}
};
int main() {
Obj* obj1 = new Obj();
Obj* obj2 = new Obj();
obj1->child = obj2;
obj1->Change(10);
}
另外,我不知道我是否正确使用了模板 - 自从我上次使用它们以来已经很久了。每个函数都应该有自己的模板吗?如果我想将模板用于成员变量,为什么必须在类之前指定模板?
【问题讨论】:
-
好吧,显然要调用的函数(至少在模板中)是输入
void func()(不带任何参数),你用两个int参数调用Sig,当然不能工作。特别是,使用template<typename... Ts>是没用的,你只能拥有与整个Signal模板相同的参数,因此该函数可以(并且应该)是void Sig(const int& _sig, Args... args),与任何其他参数集一样无论如何它都不起作用. -
请发布 MCVE。您的代码脱离了上下文,让我们猜测如何重现编译错误。
-
@ChristianHackl 对不起,忘了电话是在别的地方,我会加进去的。
-
@areuz:如果您想对未来的读者更加友善,请添加
main函数和缺少的#includes,并删除明显不必要的内容,例如构造函数、析构函数和常量 :) -
@ChristianHackl 是的,当然 :)
标签: c++ linux stl variadic-templates c++17