2017-02-19 63 views
1

要我提出的問題here,我使用一個通用的模式是這樣解決我的問題的建議:需求定義

template <class... T> 
class C; 

template <> 
class C<> 
{ 
public: 
    void f() {} 
}; 

template <class T, class... Args> 
class C<T, Args...> : public C<Args...> 
{ 
public: 
    using C<Args...>::f; 
    void f(const T& t) { /*stuff*/ } 
}; 

現在,我不完全理解爲什麼這種模式必須是這樣的,所以我試圖通過一個關於它如何工作的假設來適應它。在適應我想結束在基本情況下,遞歸1個也不是0模板參數,所以我改變了代碼片段如下:

template <class V, class... > 
class C; 

template <class V> 
class C 
{ 
public: 
    void f() {} 
}; 

template <class V, class T, class... Args> 
class C<V, T, Args...> : public C<V, Args...> 
{ 
public: 
    using C<Args...>::f; 
    void f(const T& t) { /*stuff*/ } 
}; 

這裏V應該繼續獲得通過,直到Args...是空的,那麼

template <class V> 
class C 
{ 
public: 
    void f() {} 
}; 

應該被選中。然而這會引發一個錯誤:

error: too few template parameters in template redeclaration 
template <class V> 
^~~~~~~~~~~~~~~~~~ 

note: previous template declaration is here 
template <class V, class... > 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

所以我的假設是錯誤的。這實際上是如何工作的,對我的適應而言,正確的改變是什麼?

回答

1

兩個錯誤的位置: 首先,不正確的專業化:

template <class V> 
class C 
{ 
    //... 
}; 

應該是:

template <class V> 
class C<V> 
{ 
    //... 
}; 

其次,不正確using聲明:

using C<Args...>::f; 

應該是:

using C<V, Args...>::f; 
+0

感謝,爲什麼''在'模板 C類'雖然要求? Afteral只有一個模板參數。 –

+1

這是專業化語法,'C'是基本情況,'C '是單個模板參數的專用案例。 – xinaiz

1

你忘了正確的拼寫專業化:

template <class V> 
class C<V> 
// ^^^^ you missed this