在下面的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。在那裏它被稱爲冗餘語法。
這也是我的想法。它看起來類似於函數模板專門化與過載參數。但是在這種情況下,解決方案等方面有一些重要細節。也許在這裏不是這種情況?打印出typeid()表明它們具有相同的損壞名稱 –
這裏就是這種情況,並且在每個模板中,模板專業化基本上是告訴編譯器「不要使用其他植入,使用這個我在這裏給你的這個「。 不知道爲什麼你說他們有相同的mangled名稱,這些是兩個不同的類在運行時,並有不同的名稱。 – sagiema