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

use*_*825 4 c++ templates c++11 c++14

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

有效的模板结构

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;
};
Run Code Online (Sandbox Code Playgroud)

模板结构不起作用

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;
};
Run Code Online (Sandbox Code Playgroud)

还有一个不起作用

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;
};
Run Code Online (Sandbox Code Playgroud)

和主要功能

template <class A, class B>
bool IsSameClass() {
  return is_same<A, B>::value;
}
int main()
{
  bool ret =    IsSameClass<P,C>();
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ker 7

您总是从模板定义开始:

template <class T, class U>
class is_same { ... };
Run Code Online (Sandbox Code Playgroud)

或者,正如Jarod42提醒我的那样,声明:

template <class T, class U> class is_same;
Run Code Online (Sandbox Code Playgroud)

一旦有了模板,您可以通过改进一个或多个模板参数来定义部分特化,如您的示例所示:

template <class T>
class is_same<T, T> { ...};
Run Code Online (Sandbox Code Playgroud)

专门化仍然需要两个参数,就像原始模板一样,但它们是相同的类型,因此template <...>在定义的部分中只有一个类型名称.

在使用中,is_same<int, double>将匹配模板定义; is_same<int, int>将匹配部分特化.

您还可以指定完整的专业化.不是你想在这里,但继续这个例子:

template <>
class is_same<void, void> { ... };
Run Code Online (Sandbox Code Playgroud)

显然,这很匹配is_same<void, void>.

其他两个尝试不起作用的原因是它们都没有模板定义,只有看起来像特化的东西.如果没有定义,就没有什么特别的了.

请注意,这有点过于简单化了.它旨在解决"为什么这些东西不起作用",而不是"我如何专门化模板".