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

Visual Studio 2019使用nlohmann json.hpp遇C2679编译错误求助

问题原因

错误C2679是因为TestClass1的赋值运算符被声明为virtual,而nlohmann JSON的非侵入式序列化宏NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE在生成反序列化代码时,无法正确匹配这个带virtual修饰的赋值运算符。虽然你的赋值运算符签名本身合法,但virtual修饰符在这里属于多余声明(TestClass1没有基类),反而干扰了编译器对运算符的匹配逻辑。

解决方案

方案一:移除多余的virtual修饰符

去掉TestClass1中赋值运算符的virtual修饰符即可解决编译错误,修改后的代码如下:

class TestClass1 
{ 
public: 
    TestClass1 & operator = (const TestClass1 & o) 
    { 
        this->t1 = o.t1; // 补充实际赋值逻辑,避免空实现的逻辑问题
        return *this; 
    } 

    int t1; 
}; 

class TestClass 
{ 
public: 
    TestClass1 tt1; 
}; 

NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(TestClass, tt1)

方案二:显式提供序列化特化(保留多态需求)

如果业务场景需要TestClass1作为多态基类保留virtual赋值运算符,可以显式为TestClass1编写nlohmann JSON的序列化/反序列化特化,替代非侵入式宏的自动生成逻辑:

class TestClass1 
{ 
public: 
    virtual TestClass1 & operator = (const TestClass1 & o) 
    { 
        this->t1 = o.t1;
        return *this; 
    } 

    int t1; 
}; 

class TestClass 
{ 
public: 
    TestClass1 tt1; 
}; 

// 为TestClass1编写显式的序列化特化
namespace nlohmann {
    template<>
    struct adl_serializer<TestClass1> {
        static void to_json(json& j, const TestClass1& obj) {
            j["t1"] = obj.t1;
        }

        static void from_json(const json& j, TestClass1& obj) {
            obj.t1 = j.at("t1").get<int>();
        }
    };
}

// TestClass的非侵入式宏可正常使用
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(TestClass, tt1)

内容的提问来源于stack exchange,提问作者YigalG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:12:47