在下面的snippit中,专业化的template<>
是可选的吗?是否包含它有什么区别吗?我的第一直觉是将其包括在内,因为它或多或少意味着它是一种专业化。它在g ++ 4.9.2和Intel 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。在那里它被称为冗余语法。
答案 0 :(得分:2)
鉴于类模板的定义,
template<> // <--- optional?
template<typename T>
struct PrintMe<std::vector<T>> { ... };
无效。
您需要删除该行并使用:
template<typename T>
struct PrintMe<std::vector<T>> { ... };
答案 1 :(得分:0)
有一些方法可以查看模板和模板专业化,从而绘制出更好的画面并使整个事情更加清晰。 对我来说,在这种情况下,更容易看到这一点是不要想到
template<typename T>
struct PrintMe<std::vector<T>> { ... };
作为
的专业化template<typename T>
struct PrintMe { ... };
但是作为一个完全不同的类模板,它恰好是两个具有类似名称的方法。