これは、コンパイル エラーの原因となっているクラス テンプレートのスニペットです。
/* 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
XPでVS2005およびVS2008を使用して、過去にこのコードを正常にコンパイルしました。
現在、gcc 4.4.1 を使用して Ubuntu 9.10 でビルドしています。
Google でこのエラーを調べたtypename
ところ、行 (エラーが発生した場所) には必要ないようです。これは、その位置の識別子が型であるという標準的な前提があるためです。typename
g++ は、宣言が修飾されていることを期待しているため (つまり、A::B)、不平を言っているようです。
これは問題の正しい診断ですか? もしそうなら、どうすれば を「完全に認定」できtypename
ますか?
要するに、どうすればこの問題を解決できますか?