【问题标题】:Compiler cannot find specialized class template编译器找不到专门的类模板
【发布时间】:2020-11-22 22:27:58
【问题描述】:

我想使用部分模板专业化,但似乎我遗漏了一些东西。 这是我尝试过的:

template<class T1, class T2>
class AClass {};

template<class T>
class AClass<T, T> {}; // specialized class.

AClass<int,float> aClassIntFloat; // works just fine

AClass<int, int> aClassIntInt; // works just fine

AClass<int> specializedIntClass; //"error: wrong number of template arguments (1, should be 2)"

我错过了什么?

【问题讨论】:

  • 确实,它是一个二进制模板,那你为什么只用一个参数来实例化它呢?为第二个参数指定默认值,或定义并使用using-alias。
  • AClass&lt;int, int&gt; 是一个专门的实例化。
  • 这只是一个虚拟的例子。我真正想要的是相当复杂。我不明白为什么它不能编译。

标签: c++ templates template-specialization class-template


【解决方案1】:

首先,您已经成功定义了部分专业:

  • AClass&lt;int, int&gt; 将使用 T=int 实例化 class AClass&lt;T, T&gt;
  • AClass&lt;int,float&gt; 将用 T1=int 和 T2=float 实例化 class AClass&lt;T1, T2&gt;

您可以通过添加公共测试方法并为aClassIntFloat 和aClassIntInt (online demo) 调用它来轻松检查这一点。您会发现将使用为两个相同类型定义的部分特化。

您还可以进行另一个部分特化,例如:

template<class T2>
class AClass<double, T2>  { public: void test(){cout<<"ADT2"<<endl;}};

AClass<double, int> aClassDoubleInt; // works also fine

partial specialization 可以让您修复一些参数,但不是全部。但最后,您的模板需要两个参数,而您必须提供两个参数。唯一的问题是实例化了哪个专业化 (online demo)。

【讨论】:

  • 感谢您的回答。然而,我真正想要的是更复杂的,这只是一个虚拟的例子。无论如何,我不明白为什么带有单个模板参数的版本无法编译。当我阅读this 时,我没有看到错误。
  • @andmdnd 问题是部分或完全特化没有定义具有不同参数的新模板类(即你没有写template&lt;class T&gt;class AClass {...};)。它不会重新定义原始模板eithjer 的参数。它只是定义了一些参数,当您指定用于原始模板特化的所有参数时可以使用这些参数(这就是为什么您在单个类型 T 的部分特化中始终明确引用 AClass&lt;T,T&gt;)跨度>
  • 嗯,好的,现在我明白了。最后,我对它的作用有错误的想法。我认为它可以让我的生活更轻松,在“少打字”的意义上,比如说,两种类型都是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
相关资源
最近更新 更多