关于模板的特殊用法

yfjok22 2016-12-21 06:44:59
各位大侠,最近看了个代码包,包里大量使用了模板。碰到点不大理解的地方,向来请教下
先上代码
namespace xxx
{

template<class ParcelType>
class KinematicParcel;

template<class ParcelType>
class KinematicParcel
:
public ParcelType

{
public:

//- Class to hold kinematic particle constant properties
class constantProperties
{
protected:

xxx


private:

// Private data
xxx


public:

xxx


// Member functions

xxx
};


template<class CloudType>
class TrackingData
:
public ParcelType::template TrackingData<CloudType>

{
public:

xxx

private:

xxx

我将无关的一些成员变量和函数删去了,目前主要关于类KinematicParcel中定义的类TrackingData的定义有点不理解
ParcelType和CloudType是两个模板变量,分别用在类KinematicParcel和类TrackingData中
但类TrackingData的构造函数实在没大看懂,这里它所继承的是什么
1. ParcelType::template是什么意思,::template应该不是ParcelType实例化后的一个成员函数,那么它是C++的某种标准语法
2. public ParcelType::template TrackingData<CloudType>根据语法结构看上去更像由ParcelType::template一个定义的对象,而非类啊,那么这里想表达的到底是什么意思

为各位大侠指点
...全文
468 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2016-12-24
  • 打赏
  • 举报
回复
引用 16 楼 yfjok22 的回复:
[quote=引用 15 楼 yshuise 的回复:] [quote=引用 14 楼 yfjok22 的回复:] [quote=引用 6 楼 yshuise 的回复:] 《c++模板元编程》的P269
大侠,你推荐的这本书确实很好啊,看了以后感觉以前对模板编程的一些疑问,这里都有所涉及 不过这本书似乎不大适合beginner, 里边涉及了大量关于BOOST, STL以及一些其他前置知识 不只有木有关于这方面更适合beginner一点的书推荐[/quote] 这门书算高级了。[/quote] 是啊,感觉看起来略有点吃力 有木有低级一点,略适合新手的推荐下[/quote] 你只看附录即可,不要看书了。我反正看得懂,我以前还研究了boost的源代码呢。
yfjok22 2016-12-24
  • 打赏
  • 举报
回复
引用 15 楼 yshuise 的回复:
[quote=引用 14 楼 yfjok22 的回复:] [quote=引用 6 楼 yshuise 的回复:] 《c++模板元编程》的P269
大侠,你推荐的这本书确实很好啊,看了以后感觉以前对模板编程的一些疑问,这里都有所涉及 不过这本书似乎不大适合beginner, 里边涉及了大量关于BOOST, STL以及一些其他前置知识 不只有木有关于这方面更适合beginner一点的书推荐[/quote] 这门书算高级了。[/quote] 是啊,感觉看起来略有点吃力 有木有低级一点,略适合新手的推荐下
yshuise 2016-12-24
  • 打赏
  • 举报
回复
引用 14 楼 yfjok22 的回复:
[quote=引用 6 楼 yshuise 的回复:] 《c++模板元编程》的P269
大侠,你推荐的这本书确实很好啊,看了以后感觉以前对模板编程的一些疑问,这里都有所涉及 不过这本书似乎不大适合beginner, 里边涉及了大量关于BOOST, STL以及一些其他前置知识 不只有木有关于这方面更适合beginner一点的书推荐[/quote] 这门书算高级了。
yfjok22 2016-12-24
  • 打赏
  • 举报
回复
引用 6 楼 yshuise 的回复:
《c++模板元编程》的P269
大侠,你推荐的这本书确实很好啊,看了以后感觉以前对模板编程的一些疑问,这里都有所涉及 不过这本书似乎不大适合beginner, 里边涉及了大量关于BOOST, STL以及一些其他前置知识 不只有木有关于这方面更适合beginner一点的书推荐
超级能量泡泡 2016-12-23
  • 打赏
  • 举报
回复
引用 7 楼 ri_aje 的回复:
就是这么个意思。

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关键词
ri_aje 2016-12-23
  • 打赏
  • 举报
回复
引用 10 楼 xsklld 的回复:
[quote=引用 9 楼 ri_aje 的回复:] [quote=引用 8 楼 xsklld 的回复:] [quote=引用 7 楼 ri_aje 的回复:] 就是这么个意思。

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 下,此处这个关键字可有可无了。主楼这个用例,要么是用来对付老编译器的,要么是具体的代码存在二义性,用此来解惑的。
C++17下可有可无吗?http://www.eel.is/c++draft/temp.names#4 这段依然存在啊。[/quote] 你引用的这条在我的例子里不适用,具体而言 (简化掉无关部分): (if) When the name of a member template specialization 1. appears after a nested-name-specifier in a qualified-id, and 2. the nested-name-specifier in the qualified-id refers to a dependent type, but 3. the name is not a member of the current instantiation ([temp.dep.type]), (then) the member template name must be prefixed by the keyword template. 只有 [1-3] 都同时成立的时候,then 里面的要求才适用。我的例子里 nested name specifier 是 ParcelType,这个不是 dependent type,因为其 name 与类模版参数 CloudType 无关,即 2. 不成立,所以整个 if 挂了,then 也不存在了。 你引用的这条,适用于下面这个稍稍修改过的例子,这里面的 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。[/quote] 没看仔细,ParcelType 是 dependent type,需要 template 关键字。 就想着 <> 的情况了,忘记确认 ParcelType 是否直接是模板参数了。
xskxzr 2016-12-23
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
[quote=引用 8 楼 xsklld 的回复:] [quote=引用 7 楼 ri_aje 的回复:] 就是这么个意思。

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 下,此处这个关键字可有可无了。主楼这个用例,要么是用来对付老编译器的,要么是具体的代码存在二义性,用此来解惑的。
C++17下可有可无吗?http://www.eel.is/c++draft/temp.names#4 这段依然存在啊。[/quote] 你引用的这条在我的例子里不适用,具体而言 (简化掉无关部分): (if) When the name of a member template specialization 1. appears after a nested-name-specifier in a qualified-id, and 2. the nested-name-specifier in the qualified-id refers to a dependent type, but 3. the name is not a member of the current instantiation ([temp.dep.type]), (then) the member template name must be prefixed by the keyword template. 只有 [1-3] 都同时成立的时候,then 里面的要求才适用。我的例子里 nested name specifier 是 ParcelType,这个不是 dependent type,因为其 name 与类模版参数 CloudType 无关,即 2. 不成立,所以整个 if 挂了,then 也不存在了。 你引用的这条,适用于下面这个稍稍修改过的例子,这里面的 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] 主楼的代码简化后应该是这样的: http://coliru.stacked-crooked.com/a/fe4648f7db03b167 去掉template并不行。
xskxzr 2016-12-23
  • 打赏
  • 举报
回复
引用 9 楼 ri_aje 的回复:
[quote=引用 8 楼 xsklld 的回复:] [quote=引用 7 楼 ri_aje 的回复:] 就是这么个意思。

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 下,此处这个关键字可有可无了。主楼这个用例,要么是用来对付老编译器的,要么是具体的代码存在二义性,用此来解惑的。
C++17下可有可无吗?http://www.eel.is/c++draft/temp.names#4 这段依然存在啊。[/quote] 你引用的这条在我的例子里不适用,具体而言 (简化掉无关部分): (if) When the name of a member template specialization 1. appears after a nested-name-specifier in a qualified-id, and 2. the nested-name-specifier in the qualified-id refers to a dependent type, but 3. the name is not a member of the current instantiation ([temp.dep.type]), (then) the member template name must be prefixed by the keyword template. 只有 [1-3] 都同时成立的时候,then 里面的要求才适用。我的例子里 nested name specifier 是 ParcelType,这个不是 dependent type,因为其 name 与类模版参数 CloudType 无关,即 2. 不成立,所以整个 if 挂了,then 也不存在了。 你引用的这条,适用于下面这个稍稍修改过的例子,这里面的 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。
ri_aje 2016-12-23
  • 打赏
  • 举报
回复
引用 8 楼 xsklld 的回复:
[quote=引用 7 楼 ri_aje 的回复:] 就是这么个意思。

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 下,此处这个关键字可有可无了。主楼这个用例,要么是用来对付老编译器的,要么是具体的代码存在二义性,用此来解惑的。
C++17下可有可无吗?http://www.eel.is/c++draft/temp.names#4 这段依然存在啊。[/quote] 你引用的这条在我的例子里不适用,具体而言 (简化掉无关部分): (if) When the name of a member template specialization 1. appears after a nested-name-specifier in a qualified-id, and 2. the nested-name-specifier in the qualified-id refers to a dependent type, but 3. the name is not a member of the current instantiation ([temp.dep.type]), (then) the member template name must be prefixed by the keyword template. 只有 [1-3] 都同时成立的时候,then 里面的要求才适用。我的例子里 nested name specifier 是 ParcelType,这个不是 dependent type,因为其 name 与类模版参数 CloudType 无关,即 2. 不成立,所以整个 if 挂了,then 也不存在了。 你引用的这条,适用于下面这个稍稍修改过的例子,这里面的 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 了。 你看这够严谨了吗?
xskxzr 2016-12-22
  • 打赏
  • 举报
回复
引用 7 楼 ri_aje 的回复:
就是这么个意思。

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 下,此处这个关键字可有可无了。主楼这个用例,要么是用来对付老编译器的,要么是具体的代码存在二义性,用此来解惑的。
C++17下可有可无吗?http://www.eel.is/c++draft/temp.names#4 这段依然存在啊。
ri_aje 2016-12-22
  • 打赏
  • 举报
回复
就是这么个意思。

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 下,此处这个关键字可有可无了。主楼这个用例,要么是用来对付老编译器的,要么是具体的代码存在二义性,用此来解惑的。
yshuise 2016-12-21
  • 打赏
  • 举报
回复
《c++模板元编程》的P269
ID870177103 2016-12-21
  • 打赏
  • 举报
回复
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
yfjok22 2016-12-21
  • 打赏
  • 举报
回复
引用 2 楼 yshuise 的回复:
sorry!我查了下书可以这样用。
如果可以这样用的话,能解释下这个用法是什么意思么 另外能否提供下关于这种用法大侠是在那本书看到的,表示没看过这种用法啊
yshuise 2016-12-21
  • 打赏
  • 举报
回复
不能用模板特化
yshuise 2016-12-21
  • 打赏
  • 举报
回复
sorry!我查了下书可以这样用。
yshuise 2016-12-21
  • 打赏
  • 举报
回复
ParcelType::template ___________________________ 我记得不能这样用

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧