繁体   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