2015-10-15 81 views
2

我有一個類需要一個大小類型作爲參數,以防一個人不想使用size_t或另一個需要強制轉換和檢查溢出的硬編碼類型。 這個類也有一定的方法進行第二模板類型:C++混合模板類和模板方法時出錯

template< typename SizeType = uint32_t > 
class BufferReader 
{ 
    SizeType m_nPosition; 

    template< typename T > 
    T Read(); 
} 

我的問題是,什麼是實現這個語法?

template< typename SizeType, typename T > 
T BufferReader<SizeType>::Read() 
{ 
    // ... 
} 

這給了我一個錯誤:

invalid use of incomplete type 'class core::BufferReader<SizeType>' 

或者:

template< typename T > 
template< typename SizeType > 
T BufferReader<SizeType>::Read() 
{ 
    // ... 
} 

其中給出了同樣的錯誤。

還是其他什麼?

謝謝!

回答

4

你的第二個例子是接近直角的,你只需要擁有第一和第二的那些功能的類的模板參數:

template< typename SizeType > 
template< typename T > 
T BufferReader<SizeType>::Read() 
{ 
    // ... 
} 
+0

完美!謝謝 ! – Virus721

3

你幾乎得到了它。您必須按照聲明堆疊template s:首先是課程,然後是成員。

template < typename SizeT > 
template < typename T > 
T 
BufferReader<SizeT>::Read() 
{ 
    return T {}; 
} 

注意,代碼可以通過定義權類主體功能被簡化,但據我所知,有些人會更喜歡單獨的聲明自定義審美的原因。

+0

感謝您的幫助。 – Virus721

+0

這不僅僅是美學。儘管你的實現不會走得太遠,但有一個方便和維護的理由。 –