[英]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.