问题描述
/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++编译申明的时候重复,最后报错。