这是一个类模板的片断,这是造成编译错误:预计嵌套名称说明符之前“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在X上成功编译了此代码P.
我目前正在建设在Ubuntu 9.10,使用gcc 4.4.1
我看着这个错误在谷歌和它看来,typename
是没有必要的就行了(如果发生错误),这是因为标准假设是该位置的标识符是一种类型。 g ++似乎在抱怨,因为它预计任何typename
声明都是合格的(即A :: B)。
这是对问题的正确诊断 - 如果是的话,那我该如何“完全符合”typename
?
总之,我该如何解决这个问题?
我设法解决这个问题(即得到代码编译) - 只需删除typdef decl后面的'typename'即可。 虽然头文件现在编译成功,但我仍然不满意,因为我想知道为什么我必须删除typename(尤其是在STL类中使用类似符号时)的底层(即技术原因) – 2010-02-17 12:52:48