如何解决地图的Operator []无法使用作用域枚举作为键进行编译,但是at函数起作用为什么含糊不清?
我有如下代码:
enum class MyTypes {
TYPE_1 = 1,TYPE_2 = 2,TYPE_3 = 3
};
static const std::regex reg1("some unique expression");
static const std::regex reg2("some unique expression");
static const std::regex reg3("some unique expression");
static const std::map<MyTypes,std::regex> ValidSets = {
{MyTypes::TYPE_1,reg1},{MyTypes::TYPE_2,reg2},{MyTypes::TYPE_3,reg3}
};
static const auto match = [&](const std::string& str,const std::regex& reg) -> bool {
std::smatch base_match;
return std::regex_match(str,base_match,reg);
};
template<MyTypes TYPE = MyTypes::TYPE_2> // defaulting to a specific type
class Foo {
std::string sequence_{""};
public:
const std::uint16_t Type = static_cast<uint16_t>(TYPE);
Foo() = default;
Foo(const std::string_view sequence) {
assert(!sequence.empty() && "invalid input,must contain at least 1 character.");
// Fails to compile
assert(match(sequence.data(),ValidSets[TYPE]) && "invalid sequence set for this type.");
// Works
assert(match(sequence.data(),ValidSets.at(TYPE)) && "invalid sequence set for this type.");
sequence_ = sequence;
}
};
然后我将尝试按以下方式使用它:
int main() {
Foo bar_d("some character sequence"); // must match the regex for the default type
Foo<Type::TYPE1> bar_1("some character sequence"); // must match the regex for type 1
Foo<Type::TYPE3> bar_3("some character sequence"); // must match the regex for type 3
return 0;
}
但是,ValidSets[TYPE]
无法在Visual Studio 2017编译器错误C2678
中进行编译。但是,当我将其更改为使用ValidSets.at(TYPE)
时,它可以编译并执行得很好...
为什么一个不能编译而另一个可以工作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。