模板参数 1 对 deque 无效

Template argument 1 is invalid with deque

本文关键字:deque 无效 参数      更新时间:2023-10-16

当我尝试编译下面的代码时,我收到以下错误。请为该问题提出一个好的解决方法。

.

/DataSecurity.h:60:错误:模板参数 1 无效 ./DataSecurity.h:60:错误:模板参数 2 无效 ./DataSecurity.h:60:错误:标记之前的预期非限定 id>。

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也是一个模板

IdsType是命名空间

  1. CDsTableRec模板,则需要为其提供模板参数。

  2. 这条线上的许多人都有>

  3. CDsTableRec<X>::CPtr是一个依赖名称,因此您还需要一个typename。(请参阅"我必须在何处以及为什么必须放置"模板"和"类型名"关键字?

因此,完整且可能有效的声明看起来像

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(或更高标准)的旧编译器,那么你必须重新考虑你的设计。