具有相同名称和不同模板参数的两个结构如何工作

时间:2016-03-22 16:46:27

标签: c++ templates c++11 c++14

为什么只有第一个实现工作而不是下面指定的其他实现, 有人可以解释这个模板结构的工作方式以及其他人不这样做的原因。

有效的模板结构

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;
};

2 个答案:

答案 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;
};

语言根本不允许这样做。