std::make_tuple与std::optional对象配合使用报错求助
问题:返回std::optional组成的std::tuple编译失败
尝试返回一个由std::optional<>类型组成的std::tuple,但编译失败,报错信息参考性不强,求助解决。
源代码
using namespace std; class obj { public: obj() = default; obj(int i) : i_{i} {} int I() const {return i_;} int const & rI() const {return i_;} void I(int i) {i_ = i;} void show() const {cout << "addr = " << this << ", i_ = " << I() << endl;} private: int i_{0}; }; struct { optional<obj> o_0 {nullopt}; optional<obj> o_1 {nullopt}; optional<obj> o_2 {nullopt}; void set_o0(obj o_) {o_0 = o_;} void set_o1(obj o_) {o_1 = o_;} void set_o2(obj o_) {o_2 = o_;} tuple<optional<obj>, optional<obj>, optional<obj>> get_obj() { return make_tuple<o_0, o_1, o_2>; } } opts_;
报错信息
<source>: In member function 'std::tuple<std::optional<obj>, std::optional<obj>, std::optional<obj> ><unnamed struct>::get_obj()': <source>:40:27: error: use of 'this' in a constant expression 40 | return make_tuple<o_0, o_1, o_2>; | ^~~ <source>:40:32: error: use of 'this' in a constant expression 40 | return make_tuple<o_0, o_1, o_2>; | ^~~ <source>:40:37: error: use of 'this' in a constant expression 40 | return make_tuple<o_0, o_1, o_2>; | ^~~ <source>:40:16: error: cannot resolve overloaded function 'make_tuple' based on conversion to type 'std::tuple<std::optional<obj>, std::optional<obj>, std::optional<obj> >' 40 | return make_tuple<o_0, o_1, o_2>; | ^~~~~~~~~~~~~~~~~~~~~~~~~
解决方案
错误原因
std::make_tuple是函数模板,需要通过函数调用传递参数,而非将变量作为模板参数传入。模板参数要求是编译期常量,而成员变量o_0、o_1、o_2是运行期对象,无法作为模板参数使用,这就是报错"在常量表达式中使用this"的核心原因。同时,代码遗漏了函数调用的圆括号,导致编译器无法识别这是一个函数调用。
修复代码
只需将get_obj()函数中的返回语句修改为函数调用形式:
tuple<optional<obj>, optional<obj>, optional<obj>> get_obj() { return make_tuple(o_0, o_1, o_2); // 替换尖括号为圆括号,传递变量作为参数 }
std::make_tuple会自动推导每个参数的类型,无需显式指定模板参数。
内容的提问来源于stack exchange,提问作者Ahmed R
相关产品推荐
相关产品推荐

