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
相关产品推荐
相关产品推荐

