对于嵌套类,我想使用一类嵌套类作为模板类型名称,请参阅以下代码:

#include <stdio.h>
#include <stdint.h>

struct H264 {
    struct NAL_UNIT {
        uint8_t nal_ref_idc;
        uint8_t nal_unit_type;
    };
};

struct H265 {
    struct NAL_UNIT {
        uint8_t nal_unit_type;
        uint8_t nuh_layer_id;
        uint8_t nuh_temporal_id_plus1;
    };
};

template <class T> void PrintNALUnitType(T::NAL_UNIT& nal_unit) {
    printf("nal_unit_type: %d.\n", nal_unit.nal_unit_type);
}

int main() {
    H264::NAL_UNIT h264_nu;
    h264_nu.nal_ref_idc = 2;
    h264_nu.nal_unit_type = 5;

    H265::NAL_UNIT h265_nu;
    h265_nu.nal_unit_type = 35;
    h265_nu.nuh_layer_id = 0;
    h265_nu.nuh_temporal_id_plus1 = 1;

    PrintNALUnitType(h264_nu);
    return 0;
}

然而,它在gcc中编译失败,
namespace.cpp:22:26: error: variable or field ‘PrintNALUnitType’ declared void
 void PrintNALUnitType(T::NAL_UNIT& nal_unit)
                          ^~~~~~~~
namespace.cpp:22:36: error: ‘nal_unit’ was not declared in this scope
 void PrintNALUnitType(T::NAL_UNIT& nal_unit)
                                    ^~~~~~~~
namespace.cpp:22:36: note: suggested alternative: ‘__unix’
 void PrintNALUnitType(T::NAL_UNIT& nal_unit)
                                    ^~~~~~~~
                                    __unix
namespace.cpp: In function ‘int main()’:
namespace.cpp:38:5: error: ‘PrintNALUnitType’ was not declared in this scope
     PrintNALUnitType(h264_nu);
     ^~~~~~~~~~~~~~~~

我知道它可以通过改变来修复
template <class T>
void PrintNALUnitType(T::NAL_UNIT& nal_unit)


template <class T>
void PrintNALUnitType(T& nal_unit)

但我只是想知道为什么它打破了 c++ 规范,有人可以给出一些提示吗?

最佳答案

你可以使用这样的东西:

template <class X>
void PrintNALUnitType(typename X::NAL_UNIT& nal_unit) {
    printf("nal_unit_type: %d.\n", nal_unit.nal_unit_type);
}

int main() {
.
.
    PrintNALUnitType<H265>(h265_nu);
}

关于c++ - 一类嵌套类不能用作模板函数类型名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49695866/

10-11 22:55