2010-10-10 63 views
0
template<typename T> 
class CompoundT {   // primary template 
    public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 0, 
      IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; 
    typedef T BottomT; 
    typedef CompoundT<void> ClassT; 
}; 

template<typename T, size_t N> 
class CompoundT <T[N]> { // partial specialization for arrays 
    public: 
    enum { IsPtrT = 0, IsRefT = 0, IsArrayT = 1, 
      IsFuncT = 0, IsPtrMemT = 0 }; 
    typedef T BaseT; 
    typedef typename CompoundT<T>::BottomT BottomT; 
    typedef CompoundT<void> ClassT; 
}; 

,并在主:探测器阵列类型不工作

template<class T> 
bool isArray(T a) 
{ 
    return CompoundT<T>::IsArrayT; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
    { 
     int a[10]; 
     cout << isArray(a); 
     return 0; 
} 

为什么这不起作用?这个例子来自“模板完整指南”ch.19.2。

+0

第一个模板中是否也需要'size_t N',这样第二个模板才被认为是第一个模板的部分特化? – Arun 2010-10-10 19:19:32

回答

5

由于IsArray的必须采取参考,否则,如果您按值取一个数组是一样的,如果你把一个指针:)

template <class T> 
bool isArray(const T&) {...} 

因为

void f(int a[10]); 

void f(int* a); 

是等效的声明。

+0

哇,你还在这里,我的意思是整天吗? ;)谢谢btw。 – 2010-10-10 19:20:27

+0

@There:不,事实上,我刚刚5分钟前回到家。我的回答有帮助吗? – 2010-10-10 19:21:25

+0

是的,谢谢。虽然不能接受。必须等待15分钟。 – 2010-10-10 19:22:57