redeclared with different access struct __xfer_bufptrs报错解决

解决C++编译报错

redeclared with different access struct __xfer_bufptrs报错解决

问题描述

/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../include/c++/8.3.0/sstream:301:7: error: 'struct std::__cxx11::basic_stringbuf<_CharT, _Traits, _Alloc>::__xfer_bufptrs' redeclared with different access
       struct __xfer_bufptrs

笔者在bazel编译的时候,出现这个报错
经过排查发现是BUILD里面文件的配置问题
(笔者找过网上的解决办法,目前没有涉及到这个方面的,这篇blog算是这方面问题的一个新补充,希望能够帮到正在阅读的你)

cc_test(
    name = "gtest-wanyouyu",
    srcs = glob([
        "gtest/demo.cpp",
    ]),
    copts = [
        # "-Dprivate=public",
        # "-Dprotected=public",
        # "-rdynamic",
        # "-std=c++14",
        # "-Wno-deprecated",
        # "-DENABLE_LOGGER",

        "-std=c++17",

        # "-gdwarf-2",
        # "-flto",
    ],
    # data = [
    #     ":test_data",
    # ],
    linkstatic = 1,
    deps = [
        # "//framework:framework_lib",
        # "//plugin/index_server/display_ad:display_ad_lib",
        # "@com_github_gflags_gflags//:gflags",
        "@com_google_googletest//:gtest_main",
    ],
)

分析和解决办法

这里的
"-Dprivate=public",
"-Dprotected=public",
要注释掉!

注释完之后问题就解决了

分析:
他们分别的意思是
-Dprivate=public:这个参数会将所有的private关键字替换为public。这意味着原本被声明为私有的类成员(变量和函数)将会被视为公有成员。这样做会破坏类的封装性,因为原本私有的成员现在可以从类的外部被访问和修改。
-Dprotected=public:同样的,这个参数会将所有的protected关键字替换为public。原本被声明为受保护的类成员将会被视为公有成员。受保护的成员原本是可以被类的子类访问的,现在它们也可以被类的外部直接访问。

这两行代码改变了我们代码中的变量的作用域,导致C++编译申明的时候重复,最后报错。

在使用 Spark SQL 时,如果在查询中使用了 `STRUCT_FIELDS` 函数并遇到错误提示 `STRUCT_FIELDS not found`,这通常是因为该函数在当前的 Spark 版本中不可用。Spark SQL 并未原生支持 `STRUCT_FIELDS` 函数,该函数在某些特定版本或分支中可能存在,但并不属于标准 Spark SQL 的内置函数库。 根据 Spark 的官方文档和标准 SQL 语法规范,目前(截至 Spark 3.4)并没有引入 `STRUCT_FIELDS` 这个函数来动态获取结构体字段名称数组。因此,尝试使用该函数会导致解析错误或运行时异常。 如果需要实现类似功能,可以使用以下替代方法: ### 使用 `struct` 和 `explode` 构建 Map 通过将结构体字段手动转换为键值对数组,再使用 `map_from_arrays` 构建 Map: ```sql SELECT id, map_from_arrays( array('field1', 'field2', 'field3'), array(struct_col.field1, struct_col.field2, struct_col.field3) ) AS dynamic_map FROM df ``` 此方法适用于字段数量固定的情况。 ### 动态处理 Struct 字段(DataFrame API) 在 DataFrame API 中,可以通过反射获取结构体字段名称,然后动态构建 Map 表达式: ```scala import org.apache.spark.sql.functions._ val structFieldNames = df.select("struct_col").schema(0).dataType.asInstanceOf[StructType].fieldNames val keys = array(structFieldNames.map(lit): _*) val values = array(structFieldNames.map(f => col("struct_col")(f)): _*) val mapExpression = map_from_arrays(keys, values) val resultDF = df.withColumn("map_col", mapExpression) ``` 该方法适用于字段数量不固定或运行时变化的结构体字段。 ### 使用 `to_json` 和 `from_json` 转换结构体 如果结构体字段较多或嵌套较深,可以考虑将结构体转换为 JSON 字符串,再解析为 Map: ```sql SELECT id, from_json(to_json(struct_col), 'map<string, string>') AS jsonMap FROM df ``` 此方法适用于结构体字段类型一致或可转换为字符串的情况。 ### 总结 - `STRUCT_FIELDS` 不是 Spark SQL 的标准内置函数,因此使用时会提示找不到该函数。 - 可以通过手动列出字段名、使用 DataFrame API 动态构建 Map,或使用 `to_json`/`from_json` 转换来实现类似功能。 - 建议在开发过程中查阅当前 Spark 版本的官方文档,确保使用的函数和语法是支持的。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原创小白变怪兽

帮助原创小白成为怪兽吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值