一类嵌套类不能用作模板函数类型名



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

#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 T>
void PrintNALUnitType(typename T::NAL_UNIT& nal_unit) {
printf("nal_unit_type: %d.n", nal_unit.nal_unit_type);
}

当调用函数时,模板参数 T 无法从参数的类型推导出来,如PrintNALUnitType(h264_nu);中所示。

[temp.deduct.type]/8 列出了模板函数参数类型必须具有可扣除的可能形式:

如果 P 和 A 具有以下形式之一,则可以推导出模板类型参数 T、模板模板参数 TT 或模板非类型参数 i:

T

简历列表 T

T*

T&

T&&

T[整数常量]

模板名称(其中模板名称是指类模板)

类型(T)

T()

T(T)

T型::*

类型T::*

TT::*

T (类型::*)()

类型 (T::*)()

类型(类型::*)(T)

类型 (T::*)(T)

T(类型::*)(T)

T(T::*)()

T(T::*)(T)

类型[i]

模板名称(其中模板名称是指类模板)

电传

电传

TT

<> 其中 (T) 表示参数类型列表 ([dcl.fct]),其中至少有一个参数类型包含 T,() 表示没有参数类型包含 T 的参数类型列表。同样,表示至少一个参数包含 T 的模板参数列表,表示至少一个参数包含 i 的模板参数列表,<>表示没有参数包含 T 或 i 的模板参数列表。

你可以使用这样的东西:

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);
}

最新更新