2011-08-02 84 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; 
} 

也許如果你能告訴我們你正在試圖解決,這將有助於真正的問題。