C++双类型operator<检查Concept的使用语法修正求助
问题分析与修正方案
你的代码问题在于二元Concept的使用方式错误:LsOp是需要两个类型参数的Concept,但在operator<的模板约束中只传入了一个参数_T,没有关联到MyClass的T类型,导致Concept无法完成正确的约束检查。
下面提供两种可行的修正方案:
方案一:直接在约束中传递两个类型参数
修改operator<的模板声明,明确将MyClass的T和模板参数U传入LsOp:
#include <concepts> // 若使用std::convertible_to则需要包含,仅用bool约束可省略 template<class T, class U> concept LsOp = requires (const T& r, const U& l) { // 建议用std::convertible_to<bool>替代bool,兼容返回可转bool类型的operator< { r < l } -> std::convertible_to<bool>; }; template<class T> class MyClass { public: // 明确指定LsOp的两个类型参数:MyClass的T和当前模板参数U template<class U> requires LsOp<T, U> [[nodiscard]] bool operator<(const U& val) const { return m_value < val; } private: T m_value; };
方案二:将Concept改写为绑定第一个参数的一元Concept
如果希望Concept的使用更简洁,可以重新定义LsOp为绑定第一个类型的一元Concept,这样在MyClass中使用时无需手动传递T:
#include <concepts> // 一元Concept:检查类型T是否能与任意类型U使用operator< template<class T> concept LsOp = requires (const T& r, const auto& l) { { r < l } -> std::convertible_to<bool>; }; template<class T> class MyClass { public: // 此时LsOp<T>会约束:T与U之间可以执行operator< template<class U> requires LsOp<T> && requires(const T& r, const U& l) { r < l; } [[nodiscard]] bool operator<(const U& val) const { return m_value < val; } // 或者更简洁的方式,直接在requires中写表达式约束(无需单独定义LsOp) /* template<class U> requires requires(const T& r, const U& l) { { r < l } -> std::convertible_to<bool>; } [[nodiscard]] bool operator<(const U& val) const { return m_value < val; } */ private: T m_value; };
额外注意事项
- 原代码中
_T、_val这类以下划线开头的标识符,在C++中如果是全局作用域或大写字母开头的标识符属于保留名称,建议改为U、val这类更安全的命名。 - 原Concept中的
-> bool要求operator<的返回值必须精确为bool类型,使用std::convertible_to<bool>可以兼容返回值可隐式转换为bool的情况(比如std::strong_ordering等),更符合C++20的比较语义。
内容的提问来源于stack exchange,提问作者DipStax
相关产品推荐
相关产品推荐

