当前位置: 首页 > 知识库问答 >
问题:

为啥C++模板特化在g++编译错误但是clang++成功编译?

鲜于璞瑜
2024-01-30
class Widget {public:    template<typename T>    void processPointer(T* ptr)    { }private:    template<>    void processPointer<void>(void*);};int main(){    Widget w;    w.processPointer(new int());    return 0;}

补充clang++编译后的汇编代码:

    .text    .file    "private.cpp"    .globl    main                            # -- Begin function main    .p2align    4, 0x90    .type    main,@functionmain:                                   # @main    .cfi_startproc# %bb.0:    pushq    %rbp    .cfi_def_cfa_offset 16    .cfi_offset %rbp, -16    movq    %rsp, %rbp    .cfi_def_cfa_register %rbp    subq    $16, %rsp    movl    $0, -4(%rbp)    movl    $4, %edi    callq    _Znwm@PLT    movq    %rax, %rsi    movl    $0, (%rax)    leaq    -8(%rbp), %rdi    callq    _ZN6Widget14processPointerIiEEvPT_    xorl    %eax, %eax    addq    $16, %rsp    popq    %rbp    .cfi_def_cfa %rsp, 8    retq.Lfunc_end0:    .size    main, .Lfunc_end0-main    .cfi_endproc                                        # -- End function    .section    .text._ZN6Widget14processPointerIiEEvPT_,"axG",@progbits,_ZN6Widget14processPointerIiEEvPT_,comdat    .weak    _ZN6Widget14processPointerIiEEvPT_ # -- Begin function _ZN6Widget14processPointerIiEEvPT_    .p2align    4, 0x90    .type    _ZN6Widget14processPointerIiEEvPT_,@function_ZN6Widget14processPointerIiEEvPT_:     # @_ZN6Widget14processPointerIiEEvPT_    .cfi_startproc# %bb.0:    pushq    %rbp    .cfi_def_cfa_offset 16    .cfi_offset %rbp, -16    movq    %rsp, %rbp    .cfi_def_cfa_register %rbp    movq    %rdi, -8(%rbp)    movq    %rsi, -16(%rbp)    popq    %rbp    .cfi_def_cfa %rsp, 8    retq.Lfunc_end1:    .size    _ZN6Widget14processPointerIiEEvPT_, .Lfunc_end1-_ZN6Widget14processPointerIiEEvPT_    .cfi_endproc                                        # -- End function    .ident    "Ubuntu clang version 14.0.0-1ubuntu1.1"    .section    ".note.GNU-stack","",@progbits    .addrsig    .addrsig_sym _ZN6Widget14processPointerIiEEvPT_    .addrsig_sym _Znwm

编译结果:
image.png

共有1个答案

云卓
2024-01-30

gcc 的 bug。

c++17 开始标准决定支持在类里特化,然后就有了这个 bug report ,但是现在都还没有修复。

 类似资料:
  • 下面的代码在g7.2.0中编译成功(编译标志是),但在clang 5.0.0中编译失败(使用相同的标志,)和vc 15.4(编译标志是): 哪种编译器行为符合标准?如何将该模板应用更改为在clang上编译? 叮当声错误消息: VC错误消息:

  • 本文向大家介绍C++ 用Clang编译,包括了C++ 用Clang编译的使用技巧和注意事项,需要的朋友参考一下 示例 由于锵前端被设计为是与GCC兼容,当你交换可通过GCC编译大多数程序将编译g++通过clang++在构建脚本。如果没有-std=version给出,将使用gnu11。 习惯了MSVC的Windows用户可以cl.exe与交换clang-cl.exe。默认情况下,clang尝试与已安

  • 我有一个简单的JNI.dll,试图在测试Java应用程序中使用它。它是一个文件,由几个函数组成,头部由生成。(我正在使用MinGW btw编译) 如果我用GCC编译并链接这段代码,我就可以很好地用system.loadLibrary()加载.dll并使用它。但是,如果我用G++编译它,将失败,出现可怕的“UnsatisfiedLinkError”。 g++-wl,--add-stdcall-ali

  • 我正在尝试为自定义模板类创建一个加法运算符,其中第一个参数可以是我的类的实例,也可以是基本的数字类型。My operator的定义类似于下面的示例代码: 我的预期是,由于SFINAE,试图用

  • 我有以下代码: 我希望它输出“0,1,2,3”并停止,但它输出的是一系列无穷无尽的“0、1、2、3、4、5……” 看起来比较< code>di 如果我只是注释掉< code >,delta=mc[di],我会正常得到“0,1,2,3”。无辜作业有什么问题? 我正在使用Ideone.com g14带-O2选项。

  • 我在RegexBuddy中创建了两个模式来编译输出,但在Android模式中,compile给了我一个错误。在Java7中,它编译得很好。 原始图案是 [1,[1[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-ZUU[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[a-z[0-0-0-9[0-9[0-9[0-9[9[9[9[0,30[0