2010-10-09 91 views
2

忽略这个问题,才发现在我的代码错误,标志它类型检测

这是“完全指南模板”中删除。 19.2
化合物类型是从其他类型构建的类型。简单的复合类型包括普通类型,指针类型,引用类型,甚至数组类型。它们是从单一基本类型构建的。类类型和函数类型也是复合类型,但是它们的组合可以涉及多种类型(对于参数或成员)。简单化合物类型可以使用部分专业化进行分类。我们先从描述比类类型和枚举类型(后者被分别处理的)其它化合物类型一个性状类的通用定义:

// types/type2.hpp 
template<typename T> 
class CompoundT {   // primary template 
    public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 0, 
      IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; //This suppose to be different 
    typedef T BottomT; //to this! But is typedef'ed in the same way! FFS! 
    typedef CompoundT<void> ClassT; 
}; 

的构件类型BASET是对直接型的同义词在其上的模板参数类型T构建。另一方面,BottomT指的是构建T的最终非指针,非参照和非数组类型。例如,如果T是int * ,那么BaseT将是int,而BottomT将是int。
是否做到了这一点,并尝试过并猜测哪些方法无效。对于int ** BaseT是int **和BottomT是相同的。对我来说,很明显,这本书有一个错误。如何在地球上相同的typedef'ed类型可以是不同的?对我来说它不能。我想知道应该在那里(在阶级decl。),使其工作。
谢谢。

+1

为什么要删除它的标志?你可以自己删除它 – 2010-10-09 16:50:08

+0

@ArmenTsirunyan,显然,他不能。你回答了他的问题。我相信你知道,只有在没有得到回答的情况下,主人才能删除问题:) – azizbekian 2013-03-02 10:52:25

回答

0

那么专精在哪里?是的,如果我理解正确,这是应该为非复合类型实例化的主模板。当然,仅凭这个模板,什么都不能做。在另一方面,让我们看一下指针专业化(用于阵列等,这是类似)

template<typename T> 
class CompoundT<T*> {   // specialization for pointers 
    public: 
    enum { IsPtrT = 1, IsRefT = 0, IsArrayT = 0, 
      IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; 
    typedef typename CompoundT<BaseT>::BottomT BottomT; 
    typedef CompoundT<void> ClassT; //not sure what this is for 
}; 

现在,对于int **巴塞特将是int *和BottomT将是int。 HTH