【发布时间】:2017-01-04 21:00:36
【问题描述】:
我正在开发多类型地图支架。它适用于所有原始类型,也适用于结构,例如观点。但是,如果我想添加 std::function 作为另一种支持的类型(用于回调),那么编译器会抱怨:
MT.cpp:426:15: 没有可行的重载 '='
MT.h:31:7: 候选函数 (隐式复制赋值运算符)不可行:未知 从“(在 MT.cpp:426:17 处的 lambda)”转换为“const SharkLib::MT” 对于第一个参数
MT.h:31:7:候选函数(隐式移动 赋值运算符)不可行:从 '(lambda at MT.cpp:426:17)' 到 'sharkLib::MT' 作为第一个参数
我实际上并没有重载 = 运算符,而是使用每个支持的类型的专用构造函数重载 []。
.h
protected:
map<string,MT> valueMap;
public:
MT (int value);
MT (std::function<void(Ref*)> ccb);
virtual MT& operator[] (const char* key);
.cpp
MT::MT (int value)
{
this->type = ValueType::intValue;
this->value.int_ = value;
}
MT::MT (std::function<void(Ref*)> value)
{
this->type = ValueType::ccbValue;
this->value.ccb_ = value;
}
MT& MT::operator[] (const char* key)
{
return this->valueMap[key];
}
用法
MT mt;
mt["int"] = 1;
mt["ccb"] = [](Ref *){ CCLOG("Pressed"); };
最后一行是有错误的。
【问题讨论】:
-
我敢问为什么ctors和
operator[]是同一类型吗?
标签: c++ c++11 lambda operator-overloading overloading