为什么只有第一个实现工作而不是下面指定的其他实现, 有人可以解释这个模板结构的工作方式以及其他人不这样做的原因。
有效的模板结构
class_name: AcceptanceTester
不起作用的模板结构
template <typename T, typename U>
struct is_same
{
static const bool value = false;
};
template <typename T>
struct is_same<T, T>
{
static const bool value = true;
};
还有一个不起作用
template <typename T, typename U>
struct is_same<T, U>
{
static const bool value = false;
};
template <typename T>
struct is_same<T, T>
{
static const bool value = true;
};
主要功能
template <typename T, typename U>
struct is_same<T,U>
{
static const bool value = false;
};
template <typename T>
struct is_same
{
static const bool value = true;
};
答案 0 :(得分:7)
您始终从模板定义开始:
template <class T, class U>
class is_same { ... };
或者,正如Jarod42提醒我的那样,声明:
template <class T, class U> class is_same;
一旦有了模板,您就可以通过优化一个或多个模板参数来定义部分特化,如下例所示:
template <class T>
class is_same<T, T> { ...};
专业化仍然需要两个参数,就像原始模板一样,但它们属于同一类型,因此在定义的template <...>
部分中只有一个类型名称。
在使用中,is_same<int, double>
将匹配模板定义; is_same<int, int>
将匹配部分特化。
您还可以指定完整的专业化。并不是说你想要在这里,而是继续这个例子:
template <>
class is_same<void, void> { ... };
这显然符合is_same<void, void>
。
另外两个尝试不起作用的原因是它们都没有模板定义,只有看起来像专业化的东西。如果没有定义,就没有什么特别的了。
请注意,这有点过于简单化了。它旨在解决&#34;为什么这些事情不起作用,而不是&#34;我如何专门化模板&#34;。
答案 1 :(得分:1)
语法
template <typename T, typename U>
struct is_same<T, U>
{
static const bool value = false;
};
用于创建类模板的特化。为此,您必须首先声明模板或首先创建其通用定义。
template <typename T, typename U> struct is_same;
或
template <typename T, typename U>
struct is_same
{
static const bool value = false;
};
即使你这样做了,
template <typename T, typename U>
struct is_same<T, U>
{
static const bool value = false;
};
不是有效的专业化,因为在使用is_same<int, float>
实例化时无法决定使用哪个模板。
使用以下方法无法重载模板:
template <typename T, typename U>
struct is_same
{
static const bool value = false;
};
template <typename T>
struct is_same
{
static const bool value = true;
};
语言根本不允许这样做。