2015-10-02 56 views
3

在下面的snippit中,template<>是專門化的可選項嗎?我是否包含它有沒有區別?我的第一個直覺就是將它包含在內,因爲它或多或少意味着它是一種專業化。它編譯兩種方式下兩個G ++ 4.9.2和英特爾16矢量類型的模板類專業化 - 不同的有效語法?

#include <vector> 
#include <iostream> 

template<typename T> 
struct PrintMe 
{ 
    static void Print(const T & t) 
    { 
     std::cout << "In general templated struct: " << t << "\n"; 
    } 
};  


template<> // <--- optional? 
template<typename T> 
struct PrintMe<std::vector<T>> 
{ 
    static void Print(const std::vector<T> & t) 
    { 
     std::cout << "In general specialization for vector: " << t.size() << "\n"; 
     for(const auto & it : t) 
      std::cout << "  " << it << "\n"; 
    } 

}; 


int main(void) 
{ 
    PrintMe<int>::Print(5); 
    PrintMe<double>::Print(5);  
    PrintMe<std::vector<float>>::Print({10,20,30,40}); 

    return 0; 
} 

注:出於好奇,我嘗試添加多個template<>。即,

template<> 
template<> 
template<> 
template<typename T> 
struct PrintMe<std::vector<T>> 

這仍然編譯與英特爾,但不與g ++。不知道這意味着什麼,但它很有趣。注意2:哇,這與5年前我的問題非常相似:Templated class specialization where template argument is a template。在那裏它被稱爲冗餘語法。

回答

2

鑑於類模板的定義,

template<> // <--- optional? 
template<typename T> 
struct PrintMe<std::vector<T>> { ... }; 

無效。

您需要刪除該行並使用:

template<typename T> 
struct PrintMe<std::vector<T>> { ... }; 
0

有辦法看模板和模板專業化,將描繪出更好的畫面,使整個事情更加清楚。 對我來說,在這種情況下,來看看這個簡單的辦法是不去想

template<typename T> 
struct PrintMe<std::vector<T>> { ... }; 

template<typename T> 
struct PrintMe { ... }; 

專業化,但作爲不同類模板完全,它恰好是這兩個有類似的命名方法。

+0

這也是我的想法。它看起來類似於函數模板專門化與過載參數。但是在這種情況下,解決方案等方面有一些重要細節。也許在這裏不是這種情況?打印出typeid()表明它們具有相同的損壞名稱 –

+0

這裏就是這種情況,並且在每個模板中,模板專業化基本上是告訴編譯器「不要使用其他植入,使用這個我在這裏給你的這個「。 不知道爲什麼你說他們有相同的mangled名稱,這些是兩個不同的類在運行時,並有不同的名稱。 – sagiema