我有以下代码:
template <typename Provider>
inline void use()
{
typedef Provider::Data<int> D;
}
我基本上试图使用某些'Provider'类的模板类成员'Data',应用于'int',但是我得到以下错误:
util.cpp:5: error: expected init-declarator before '<' token
util.cpp:5: error: expected `,' or `;' before '<' token
我在Solaris系统上使用GCC 4.3.3。
答案 0 :(得分:16)
typedef typename Provider::template Data<int> D;
问题在于,当编译器第一次解析use()
时,它不知道Provider
,因此它不知道Provider::Data
指的是什么。它可以是静态数据成员,成员函数的名称或其他内容。这就是你必须把typename
放进去的原因
只要嵌套名称是模板的名称,就需要额外的template
。如果是其他内容,那么Data < ...
可能是一个比较。
答案 1 :(得分:8)
您需要typename
和template
:
template <typename Provider>
inline void use()
{
typedef typename Provider::template Data<int> D;
}