C++20 Concepts:指定模板所需特定参数构造器的问题排查
问题描述
我编写了一个生成大型随机序列的类CRandomSequenceGenerator,其GetValues模板方法可将序列部分转换为vector、list等容器。为约束容器需支持接受两个指针的构造器,我定义了CoRandomSequenceGeneratorContainer concept,但在Visual Studio 2022中调用GetValues<std::vector<uint8_t>>时,触发约束不满足的错误,提示CoRandomSequenceGeneratorContainer<std::vector<uint8_t>>评估为false,请问问题出在哪里?
相关代码
生成类代码
class CRandomSequenceGenerator { public: template<CoRandomSequenceGeneratorContainer TContainer> // 待指定的concept TContainer GetValues(size_t arraySize) noexcept { using TData = TContainer::value_type; TData* ptr; // 指向内存区域的指针 TContainer container(ptr, ptr + arraySize); return container; } };
Concept定义
template<typename TContainer> concept CoRandomSequenceGeneratorContainer = requires(typename TContainer::value_type* pdata) { TContainer::TContainer(pdata, pdata); };
调用代码
CRandomSequenceGenerator* gen; auto vb1 = gen->GetValues<std::vector<uint8_t>>(512);
错误信息(中文翻译)
error C2672: 'CRandomSequenceGenerator::GetValues': 未找到匹配的重载函数
message : 候选函数为 'TContainer CRandomSequenceGenerator::GetValues(size_t) noexcept'
message : 关联约束未满足
message : concept 'CoRandomSequenceGeneratorContainer<std::vector<uint8_t,std::allocator<uint8_t>>>' 评估为 false
问题原因及解决办法
- 问题根源:Concept定义中构造器的调用语法错误。C++里构造器不能通过
类名::构造器名的形式调用,这种写法不符合语法规范,导致约束检查失败。 - 修正后的Concept定义:
template<typename TContainer> concept CoRandomSequenceGeneratorContainer = requires(typename TContainer::value_type* pdata) { TContainer(pdata, pdata); // 直接用类名构造实例,而非TContainer::TContainer };
- 补充说明:修正后的Concept会正确检查
TContainer是否支持通过两个指向其value_type的指针完成构造,符合std::vector、std::list等标准容器的构造器要求,修正后即可通过约束检查。
内容的提问来源于stack exchange,提问作者Oleksandr N.
相关产品推荐
相关产品推荐

