交叉编译libbinder时String16.h出现编译错误求助
交叉编译libbinder时String16.h编译错误解决
问题说明
交叉编译libbinder源码期间,编译String16.h文件时触发编译错误,相关代码片段及错误信息如下:
相关代码片段
template <size_t N> class StaticString16; ... template <size_t N> class StaticString16 : public String16 { public: constexpr StaticString16(const char16_t (&s)[N]) : String16(mData), mData(makeStaticData(s)) {} constexpr StaticString16(const StaticString16<N>& other) : String16(mData), mData(other.mData) {} constexpr StaticString16(const StaticString16<N>&&) = delete; // There is no reason why one would want to 'new' a StaticString16. Delete // it to discourage misuse. static void* operator new(std::size_t) = delete; private: const StaticData<N> mData; }; template <typename F> StaticString16(const F&)->StaticString16<sizeof(F) / sizeof(char16_t)>;
编译错误信息
In file included from utils/String8.cpp:24:0: include/utils/String16.h:238:71: error: expected constructor, destructor, or type conversion before ';' token StaticString16(const F&)->StaticString16<sizeof(F) / sizeof(char16_t)>; ^
错误原因及解决办法
错误根源在于当前使用的C编译器版本不支持类模板推导指引特性,该特性是C17标准新增的内容。
两种可行解决路径:
- 升级编译器:将交叉编译工具链中的GCC或Clang升级至支持C++17的版本(例如GCC 7及以上、Clang 5及以上),同时在编译配置中添加
-std=c++17或-std=gnu++17编译选项。 - 替换推导指引:若无法升级编译器,可将C17风格的推导指引替换为C11/14兼容的模板函数:
后续代码中使用template <typename F, size_t N = sizeof(F)/sizeof(char16_t)> constexpr StaticString16<N> make_StaticString16(const F& s) { return StaticString16<N>(s); }make_StaticString16(u"目标字符串")替代直接构造StaticString16(u"目标字符串")即可。
内容的提问来源于stack exchange,提问作者yetanothercprogrammer
相关产品推荐
相关产品推荐

