模板参数1对deque无效

时间:2016-05-25 08:51:40

标签: c++ stl

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

  

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

IdsType是名称空间

1 个答案:

答案 0 :(得分:1)

  1. CDsTableRec是一个模板,您需要为其提供模板参数。

  2. 该行有>个。

  3. CDsTableRec<X>::CPtr是一个从属名称,因此您还需要typename。 (见"Where and why do I have to put the “template” and “typename” keywords?"

  4. 因此,完整且可能正常工作的声明看起来像

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