当我尝试编译以下代码时,我收到以下错误。 请为这个问题提出一个很好的解决方法'。
./ DataSecurity.h:60:错误:模板参数1无效 ./DataSecurity.h:60:错误:模板参数2无效 ./DataSecurity.h:60:错误:在'令牌之前预期的非限定标识。
template<typename E, typename C = std::basic_string<E> >
struct CDsTableRec {
typedef C CStr;
typedef Ids::Type::CCountedPointer<CDsTableRec> CPtr;
CStr m_table;
CStr m_alias;
CStr m_prefix;
CDsTableRec(const CStr& t, const CStr& a, const CStr& p) : m_table(t), m_alias(a), m_prefix(p) {}
CDsTableRec(const CStr& t) : m_table(t) {}
CDsTableRec() {}
CStr str() const {
return m_prefix + (m_alias.size() ? m_alias : m_table);
}
};
typedef std::deque<CDsTableRec::CPtr> > CTableList;
---这一行给出错误
CCountedPointer
也是一个模板
Ids
和Type
是名称空间
答案 0 :(得分:1)
CDsTableRec
是一个模板,您需要为其提供模板参数。
该行有>
个。
CDsTableRec<X>::CPtr
是一个从属名称,因此您还需要typename
。 (见"Where and why do I have to put the “template” and “typename” keywords?")
因此,完整且可能正常工作的声明看起来像
typedef std::deque<typename CDsTableRec<X>::CPtr> CTableList;
X
例如int
或类/结构名称或任何其他有效类型。
如果CTableList
也需要是模板,则无法使用typedef
,则无法创建模板化类型别名使用typedef
。相反,您需要使用using
关键字来声明模板类型别名:
template<typename T>
using CTableList = std::deque<typename CDsTableRec<T>::CPtr>;
请注意,这是在C ++ 11标准中引入的。如果你有一个不支持C ++ 11(或更高标准)的旧编译器,那么你必须重新考虑你的设计。