64,650
社区成员
发帖
与我相关
我的任务
分享
template <typename>
struct ParcelType
{
template <typename>
struct TrackingData
{
};
};
template <typename CloudType>
struct TrackingData : ParcelType<CloudType>::template TrackingData<CloudType>
{
};
在你手头的代码里面,这一条可能适用,也可能不适用,具体那种情况,看不到完整可编译代码,我也没法确定。为了包容这种可能性,不至于错误引导你,所以我特地说“要么是具体的代码存在二义性,用此来解惑的。”
不过你既然扣起来,我又仔细看了一下。主楼代码中 ParcelType 的使用方法说明它一定是个类类型,而非类模版。这样它在 ParcelType::template TrackingData<CloudType> 中就不可能是 dependent type,所以这里的 template 应该是不需要的。你把 template 删掉,看看还能编译吗?我觉得应该可以。
另外 #7 说的可能不好,应该这样说更好:
在我 #7 举出的例子里,template 关键字可有可无,这一点受 c++98/03/11/14/17 支持,即标准在这上面从未变过。至于主楼的例子里,template 关键字可能有必要,也可能没有必要,只能依据具体代码判断了。如果懒得研究又不愿意帽出错的风险,最简单的是加上 template 了。
你看这够严谨了吗?[/quote]
主楼代码中TrackingData是KinematicParcel的内嵌类, ParcelType是模板形参,是dependent type。[/quote]
没看仔细,ParcelType 是 dependent type,需要 template 关键字。
就想着 <> 的情况了,忘记确认 ParcelType 是否直接是模板参数了。
template <typename>
struct ParcelType
{
template <typename>
struct TrackingData
{
};
};
template <typename CloudType>
struct TrackingData : ParcelType<CloudType>::template TrackingData<CloudType>
{
};
在你手头的代码里面,这一条可能适用,也可能不适用,具体那种情况,看不到完整可编译代码,我也没法确定。为了包容这种可能性,不至于错误引导你,所以我特地说“要么是具体的代码存在二义性,用此来解惑的。”
不过你既然扣起来,我又仔细看了一下。主楼代码中 ParcelType 的使用方法说明它一定是个类类型,而非类模版。这样它在 ParcelType::template TrackingData<CloudType> 中就不可能是 dependent type,所以这里的 template 应该是不需要的。你把 template 删掉,看看还能编译吗?我觉得应该可以。
另外 #7 说的可能不好,应该这样说更好:
在我 #7 举出的例子里,template 关键字可有可无,这一点受 c++98/03/11/14/17 支持,即标准在这上面从未变过。至于主楼的例子里,template 关键字可能有必要,也可能没有必要,只能依据具体代码判断了。如果懒得研究又不愿意帽出错的风险,最简单的是加上 template 了。
你看这够严谨了吗?[/quote]
主楼的代码简化后应该是这样的:
http://coliru.stacked-crooked.com/a/fe4648f7db03b167
去掉template并不行。
template <typename>
struct ParcelType
{
template <typename>
struct TrackingData
{
};
};
template <typename CloudType>
struct TrackingData : ParcelType<CloudType>::template TrackingData<CloudType>
{
};
在你手头的代码里面,这一条可能适用,也可能不适用,具体那种情况,看不到完整可编译代码,我也没法确定。为了包容这种可能性,不至于错误引导你,所以我特地说“要么是具体的代码存在二义性,用此来解惑的。”
不过你既然扣起来,我又仔细看了一下。主楼代码中 ParcelType 的使用方法说明它一定是个类类型,而非类模版。这样它在 ParcelType::template TrackingData<CloudType> 中就不可能是 dependent type,所以这里的 template 应该是不需要的。你把 template 删掉,看看还能编译吗?我觉得应该可以。
另外 #7 说的可能不好,应该这样说更好:
在我 #7 举出的例子里,template 关键字可有可无,这一点受 c++98/03/11/14/17 支持,即标准在这上面从未变过。至于主楼的例子里,template 关键字可能有必要,也可能没有必要,只能依据具体代码判断了。如果懒得研究又不愿意帽出错的风险,最简单的是加上 template 了。
你看这够严谨了吗?[/quote]
主楼代码中TrackingData是KinematicParcel的内嵌类, ParcelType是模板形参,是dependent type。
template <typename>
struct ParcelType
{
template <typename>
struct TrackingData
{
};
};
template <typename CloudType>
struct TrackingData : ParcelType<CloudType>::template TrackingData<CloudType>
{
};
在你手头的代码里面,这一条可能适用,也可能不适用,具体那种情况,看不到完整可编译代码,我也没法确定。为了包容这种可能性,不至于错误引导你,所以我特地说“要么是具体的代码存在二义性,用此来解惑的。”
不过你既然扣起来,我又仔细看了一下。主楼代码中 ParcelType 的使用方法说明它一定是个类类型,而非类模版。这样它在 ParcelType::template TrackingData<CloudType> 中就不可能是 dependent type,所以这里的 template 应该是不需要的。你把 template 删掉,看看还能编译吗?我觉得应该可以。
另外 #7 说的可能不好,应该这样说更好:
在我 #7 举出的例子里,template 关键字可有可无,这一点受 c++98/03/11/14/17 支持,即标准在这上面从未变过。至于主楼的例子里,template 关键字可能有必要,也可能没有必要,只能依据具体代码判断了。如果懒得研究又不愿意帽出错的风险,最简单的是加上 template 了。
你看这够严谨了吗?
struct ParcelType
{
template <typename>
struct TrackingData
{
};
};
template <typename CloudType>
struct TrackingData : ParcelType::template TrackingData<CloudType>
{
};
parcel type 里面有一个类模版叫 tracking data,外面的 tracking data 从里面这个继承。
ParcelType::template 里的 template 是个关键字,提醒编译器后面的 TrackingData 是个类模版。
c++17 下,此处这个关键字可有可无了。主楼这个用例,要么是用来对付老编译器的,要么是具体的代码存在二义性,用此来解惑的。template <class T1>
struct A ;
template <class T1>
struct A :public T1 {
template <class T2>
struct B :public T1::template B<T2> {} ;
} ;
struct AA {
template <class T2>
struct B {
T2 data ;
} ;
} ;
int main () {
A<AA>::B<int> aa_b_int ;
aa_b_int.data = 0 ;
return 0 ;
}
用法大概是A继承AA,A::B继承AA::B