簡體   English   中英

在'sktraits'之前預期的嵌套名稱說明符

[英]expected nested-name-specifier before 'sktraits'

這是一個類模板的片段,它導致編譯錯誤:

/* Secondary index class */
template<class TKey, class TVal, class key_traits, class val_traits>
template<class TSecKey, class sktraits> 
class CBtreeDb<TKey, TVal, key_traits, val_traits>::CDbSecondaryIndex: protected CBtreeDb<TKey, TVal>, public IDeallocateKey
{
public:
 typedef TSecKey           skey_type;
 typedef typename sktraits                         skey_traits;
 typedef CNewDbt<TSecKey, sktraits>                CDbSKey;
 typedef typename iterator_t<TSecKey, skey_traits> iterator;
 typedef typename iter_lower_bound_t<skey_type>    iter_lower_bound;
 typedef typename iter_upper_bound_t<skey_type>    iter_upper_bound;

 CDbSecondaryIndex(CDbEnv* pEnv, u_int32_t flags, bool bAllowDuplicates=false):
  CBtreeDb(pEnv, flags, bAllowDuplicates)
 {

 }

    // Class implementation continues ...
};

我得到的編譯器錯誤消息是:

expected nested-name-specifier before 'sktraits'.

實際上,每個typedef聲明后跟typename都會出現此錯誤

我在過去使用VS2005和VS2008在XP上成功編譯了這段代碼。

我目前正在使用gcc 4.4.1在Ubuntu 9.10上構建

我在Google上查看了這個錯誤,看起來行上沒有必要輸入typename (發生錯誤的地方),因為標准假設是該位置的標識符是一種類型。 g ++似乎在抱怨,因為它希望那里的任何typename聲明都是合格的(即A :: B)。

這是對問題的正確診斷 - 如果是,那么我如何“完全限定” typename

簡而言之,我該如何解決這個問題?

需要typename來指定依賴名稱實際上是一種類型。 您的名稱不是依賴名稱,因此不需要或不允許使用typename

更新標准實際上有這個語法定義:

:
typename
template typename template

您可以使用typename關鍵字的其他兩個位置在模板參數列表和using聲明中(在后一種情況下,它也必須后跟一個嵌套的名稱說明符)。

以下是不允許的:

template<class A>
template<class B> class F { ... };

在類/函數定義之前,您最多只能有一個template<>規范。

暫無
暫無

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

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