cannot pass objects of non-trivially-copyable type 'std::string ...' through '...'


ndk编译报错,是输出日志的错, 

Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml    
[armeabi-v7a] Compile++ thumb: SeetafaceSo <= Seetaface_JniClient.cpp
In file included from jni/CMImgProc.h:19:0,
                 from jni/Seetaface_JniClient.cpp:14:
jni/Seetaface_JniClient.cpp: In function '_jbyteArray* Java_seetaface_SeetaFace_CMCropFace(JNIEnv*, jobject, jbyteArray, jint, jint, jint, jstring, jobject)':
jni/ndk_log.h:4:77: error: cannot pass objects of non-trivially-copyable type 'std::string {aka class std::basic_string<char>}' through '...'
 #define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
                                                                             ^
jni/Seetaface_JniClient.cpp:1028:2: note: in expansion of macro 'LOGD'
  LOGD("tRetFacePosStr=%s", tRetFacePosStr );
  ^
jni/ndk_log.h:4:77: warning: format '%s' expects argument of type 'char*', but argument 4 has type 'std::string {aka std::basic_string<char>}' [-Wformat=]
 #define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
                                                                             ^
jni/Seetaface_JniClient.cpp:1028:2: note: in expansion of macro 'LOGD'
  LOGD("tRetFacePosStr=%s", tRetFacePosStr );
  ^
make.exe: *** [obj/local/armeabi-v7a/objs/SeetafaceSo/Seetaface_JniClient.o] Error 1

原来是这一行的错: 

LOGD("tRetFacePosStr=%s", tRetFacePosStr );

因为tRetFacePosStr 是string类型的,不是char*类型,

解决方法: 

LOGD("tRetFacePosStr=%s", tRetFacePosStr.c_str());

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示是说不能通过省略号(ellipsis)传递非平凡复制类型(non-trivially-copyable type)的对象,其中的例子是字符串类 std::string(也被称为 std::basic_string<char>)。 简单来说,这个错误提示通常发生在函数定义或声明中,当你尝试通过省略号("...")来传递一个不支持复制或赋值操作的对象时会出现。这是因为省略号语法要求所有参数都支持复制操作,而某些类(如 std::string)并不支持这些操作。 要解决这个问题,你可以考虑使用指针或引用来传递对象,或者使用支持复制的类型来替换不支持复制的类型。如果你仍然需要传递非平凡复制类型的对象,你可以考虑使用其他的参数传递方式,如指定一个结构体或类作为参数,然后在该结构体或类中定义一个复制函数,以确保对象可以正确传递。 ### 回答2: 这个错误提示意味着在使用C++可变参数函数(va_args)时,不能传递非平凡可复制(non-trivially-copyable)类型的对象,特别是std::string这种字符串类。 这是由于非平凡可复制类型对象在复制时需要执行一些非平凡操作,如堆内存动态分配等。而va_args函数是没有办法知道如何正确复制这些对象的,因为它只知道传入的对象类型,而不知道对象的具体实现,因此会导致错误。 解决这个问题有两种方法:一种是使用平凡可复制类型的对象,如整数、浮点数、指针等等。另一种是使用指针或引用类型的对象,在调用时手动复制或转移所有权。 比如,在使用std::string时,可以使用const char*指针类型来替代string类型,并以参数方式传递地址。代码示例: ``` void my_printf(const char* format, ...) { va_list args; va_start(args, format); while (*format != '\0') { if (*format == '%') { format++; if (*format == 's') {//传递字符串 const char* str = va_arg(args, const char*); printf("%s", str); } } format++; } va_end(args); } string hello = "Hello World!"; my_printf("%s", hello.c_str());//使用const char*指针传递字符串 ``` 总之,在对非平凡可复制类型的对象进行复制时,一定要注意是否存在此类错误,并采取正确的解决方法。 ### 回答3: 这句话是C++中一个编译器报错信息,提示我们不能将一个非平凡复制类型的对象通过‘...’传递。简单来说,就是我们在使用可变参数的函数时,无法传递非平凡复制类型的对象。 平凡复制类型是指可以通过简单的内存复制进行复制的类型,比如int、double、char等基本数据类型以及一些类似于结构体的对象。而非平凡复制类型则是指不能简单地进行内存复制的类型,比如有指针、动态内存分配等特殊成员函数的类,比如std::string。 在C++中,可变参数通常使用‘...’表示,称为省略号参数。当我们定义可变参数函数时,需要在函数参数列表中使用省略号‘...’表示参数的个数未知。然而,由于可变参数传递是一种特殊的调用方式,编译器无法确定传递过来的非平凡复制类型的对象应该存储在哪里,也无法正确地释放它们。因此,编译器在编译过程中就主动报错,防止程序运行时出现不可预料的错误。 解决这个问题的方法很简单,就是避免将非平凡复制类型的对象通过可变参数传递。通常的做法是将需要传递的非平凡复制类型的对象改为引用或指针类型,并将它们放在可变参数之前的其他参数列表中传递。如果确实需要传递非平凡复制类型的对象,可以考虑使用序列化技术实现数据的保存和传输,或者使用特殊的技术来进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值