【问题标题】:C++: partial specialization of template template classesC++:模板模板类的部分特化
【发布时间】:2012-01-03 21:12:53
【问题描述】:

以下代码:

using namespace std;

template <typename X>
class Goo {};


template <typename X>
class Hoo {};


template <class A, template <typename> class B = Goo >
struct Foo {
  B<A> data;
  void foo1();
  void foo2();

};


template <typename A>
void Foo<A>::foo1() { cout << "foo1 for Goo" << endl;}


int main() {
  Foo<int> a;
  a.foo1();

}

给我一​​个编译器错误:

test.cc:18: error: invalid use of incomplete type 'struct Foo<A, Goo>'
test.cc:11: error: declaration of 'struct Foo<A, Goo>'

为什么我不能部分专门化 foo1() ?如果不是这样,我该怎么做?

我还有一个问题:如果我希望只为 A=int, B=Hoo 定义 foo2() 怎么办? 而不是任何其他组合,我该怎么做?

【问题讨论】:

  • 这不是部分特化,Foo 有两个参数,你只在Foo&lt;A&gt;::foo1 中指定一个。
  • @BoPersson:我认为我是部分专业化的。第二个模板参数默认是Goo。
  • Goo 中的 X 是什么。 Goo 是带有参数 X 的模板。它在哪里指定?
  • @jmucchiello:由 Foo 中的 Goo 数据成员。

标签: c++ templates template-specialization


【解决方案1】:

函数模板只能完全专门化,而不是部分专门化。

类模板的成员函数自动成为函数模板,它们可能确实是特化的,但只是完全的:

template <>
void Foo<int, Goo>::foo1() { }  // OK

您可以部分特化整个,然后重新定义它:

template <typename A>
struct Foo<A, Goo>
{
  // ...
};

(详见 14.7.3。)

【讨论】:

  • 我认为他甚至没有试图专攻。编辑:啊,对,通过“部分专业化”,他想省略其中一个参数。
  • 那么有没有办法部分特化模板类的成员方法,而不特化整个类本身?
  • @user231536:不,确实。这是similar, previous answer
【解决方案2】:

模板仍然有两个参数,你必须这样写:

template <typename A, template <typename> class B>
void Foo<A,B>::foo1() { cout << "foo1" << endl;}

默认已经指定,只需要指定一次。从那时起,它就像任何其他的两参数模板一样。无论 B 是什么(默认或其他),此代码都将适用。如果您希望为特定的 B 指定不同的行为,然后您需要对类进行特化,而不仅仅是对方法进行特化。

大量编辑

【讨论】:

  • 我认为@KerreckSB 的答案的某种组合,也许是我的,可能是正确的。我不确定最终目标是什么。最终,我认为迟早需要实现一个完全非专业化的foo1(),就像我写的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多