2014-05-06 97 views
0

我有一個類模板類模板偏特

class Class1; 

template <class L, template<class> class F> 
class N : public Class1, public F<L> 
{ .... } 

現在我想通過以下方式來部分專業是:

template <class L> 
class S; 

template <class L> 
class N<L, S<L> > : public Class1 
{ .... } 

但我得到了GCC以下錯誤:

type/value mismatch 

有什麼辦法可以實現我想要做的?謝謝!

回答

2

在這一行:

class N<L, S<L> > : public Class1 

S<L>不是一個模板。將其更改爲S並且它將被編譯。

1

GCC 4.8.1輸出

error: type/value mismatch at argument 2 in template parameter list for ‘template<class L, template<class> class F> class N’ 
class N<L, S<L> > : public Class1 
       ^
test.cpp:14:17: error: expected a class template, got ‘S<L>’ 

不擅長小號明確,只是做:

template <class L> 
class N<L, S> : public Class1 { }; 

工作例如:

class Class1 {}; 

template <class L, template<class> class F> 
class N : public Class1, public F<L> { }; 

template <class L> 
class S; 

template <class L> 
class N<L, S> : public Class1 { }; 

int main() {} 

編輯:我的猜測是,你可能希望能夠寫類似

int main() 
{ 
    N<int> n; 
} 

但是上面這個代碼將無法編譯:

error: wrong number of template arguments (1, should be 2) 
    N<int> n; 
    ^
error: provided for ‘template<class L, template<class> class F> class N’ 
class N : public Class1, public F<L> 
    ^
error: invalid type in declaration before ‘;’ token 
    N<int> n; 

你或許應該忘記的專業化,使用默認模板參數:

template <class L, template<class> class F = S> 
class N : public Class1, public F<L> { }; 

工作例如:

class Class1 {}; 

template <class L> 
class S {}; 

template <class L, template<class> class F = S> 
class N : public Class1, public F<L> {}; 

int main() 
{ 
    N<int> n; 
} 
2

你傳入了一個類,而不是模板作爲你的N專業化的第二個參數。我做了一些修改以便編譯(主要是從專業化中刪除<L>):

class Class1 {}; 

template <class L, template<class> class F> 
class N : public Class1, public F<L> 
{ }; 

template <class L> 
class S; 

template <class L> 
class N<L, S > : public Class1 
{ };