这是导致编译错误的类模板的片段:
/* 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
?
简而言之,我该如何解决这个问题?
答案 0 :(得分:7)
typename
来指定依赖名称实际上是一种类型。您的姓名不是依赖名称,因此不需要或不允许typename
。
更新该标准实际上具有以下语法定义:
类型名称-SPECI音响ER 的:
typename 嵌套名称指定标识符
typename nested-name-speci fi er 模板 opt simple-template- ID 的
您可以使用typename关键字的其他两个位置在模板参数列表和using
声明中(在后一种情况下,它也必须后跟一个嵌套的名称说明符)。
答案 1 :(得分:1)
不允许以下内容:
template<class A>
template<class B> class F { ... };
在类/函数定义之前,您最多只能有一个template<>
规范。