You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:24:47