簡體   English   中英

C ++:模板模板類的部分特化

[英]C++: partial specialization of template template classes

以下代碼:

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()而不是任何其他組合,我該怎么做?

功能模板可能只是完全專業化,而不是部分專用。

類模板的成員函數是自動函數模板,它們可能確實是專用的,但只是完全:

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

您可以部分地專門化整個 ,然后重新定義它:

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

(詳見14.7.3)

模板仍然有兩個參數,你必須寫這樣的東西:

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

已指定默認值,只需指定一次。 從那時起,它就像任何其他雙參數模板一樣。 無論B是什么(默認或其他),此代碼都適用。 如果您希望為特定B指定不同的行為, 那么您將對該類進行專門化,而不僅僅是對方法的專門化。

重編輯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM