2011-08-02 82 views
2
#include <iostream> 

template<typename T, int = 0> 
struct test { 
    typedef char type[3]; 
}; 

template<int N> 
struct test<long *, N> { 
    typedef char type[7]; 
}; 

int main() 
{ 
    std::cout << sizeof(test<int*>::type) << std::endl; // 3 
    std::cout << sizeof(test<long*>::type) << std::endl; // 7 
    return 0; 
} 

我预计sizeof(test<long*>::type) == 3。为什么是7?模板类型的奇怪行为

+0

你为什么期望它是3? –

回答

3

你所做的是你专门的模板,并说每当类型参数为long*时,你应该使用模板的第二种形式。对于其他参数,它将使用模板的初始形式(大小为3)。

+0

因为'template struct test '不再允许变量类型,所以只要类型参数为'long *',就可以设置它。 如果你想专注于N不为零的情况,那么也可以做到这一点(尽管你会发现它更容易让基础变成非零的情况,然后有专门的零) –

+0

缺省值是否为'N'从通用形式继承? –

+1

是的。当你声明'test '(不带整数参数)时,编译器在执行专门化之前会替代'test '。 –

1

您专门化了您的模板,以便如果类型参数为long*,则大小会发生变化。我相当肯定你不能混合你想要使用的test<int*>test<123>表单(含义是什么,可能是一个类型或值的参数?)。你能做的最好的是一样的东西:

#include <iostream> 

template<typename T, int = 0> 
struct test { 
    typedef char type[3]; 
}; 

template<int N> 
struct test<int, N> { 
    typedef char type[7]; 
}; 

int main() 
{ 
    std::cout << sizeof(test<int*>::type) << std::endl; // 3 
    std::cout << sizeof(test<long*>::type) << std::endl; // 3 
    std::cout << sizeof(test<int, 123>::type) << std::endl; // 7 
    return 0; 
} 

也许如果你能告诉我们你正在试图解决,这将有助于真正的问题。