为什么CLion在模板类的unordered_map::emplace前插入template关键字?
问题原因解释
你遇到的是C模板体系下「依赖名称解析规则」的强制要求,CLion自动插入template关键字是为了符合C标准的语法要求,避免编译错误。
核心规则说明
- 你定义的
Store是模板类,成员storage_的类型为std::unordered_map<std::string, T>,其类型依赖模板参数T,属于依赖类型。 - C++标准规定:在模板的定义上下文(还未进行模板实例化的阶段)中,编译器不会查找依赖类型的内部成员,默认会将依赖类型后跟随的
<符号解析为小于运算符,而非模板参数列表的起始标记。 std::unordered_map的emplace是成员模板函数,哪怕调用时没有显式指定模板参数(靠编译器自动推导模板实参),它本质还是模板函数,所以需要加template关键字显式告知编译器:后续的emplace是一个模板成员,而非普通成员变量或普通成员函数。
不同标准的差异
如果你的项目使用C20及更高版本的标准,C20已经优化了依赖名称的解析规则,编译器可以自动识别模板成员函数的调用场景,此时这个template关键字可以省略。如果使用C++17及更早的标准,该关键字为强制要求,省略会直接引发编译错误。
示例代码
template<typename T> class Store { public: void Set(std::string const& key, T value) { // 此处template为C++17及更早标准的强制要求 storage_.template emplace(key, std::move(value)); } private: std::unordered_map<std::string, T> storage_; };
内容的提问来源于stack exchange,提问作者senloa
相关产品推荐
相关产品推荐

