【问题标题】:Template typedef is not a class or namespace name模板 typedef 不是类或命名空间名称
【发布时间】:2016-08-05 10:08:27
【问题描述】:

我正在编写一个模板类,它的行为应该像一个容器。内部数据是指向泛型类T 的智能指针向量。

标题

#include <vector>
#include <boost/shared_ptr.hpp>

namespace Foo
{
  template <class T>
  class AstrContainer
  {

  public:

      typedef boost::shared_ptr<T> p_element;
      typedef std::vector<p_element> v_p_elements;

  protected:

    v_p_elements _vData;

  public:
    AstrContainer();
    virtual ~AstrContainer();

    typename v_p_elements::iterator begin();
    typename v_p_elements::iterator end();
  };
}

来源

#include "AstrContainer.hpp"

namespace Foo
{
    template<class T>
    AstrContainer<T>::AstrContainer()
    {
    }

    template<class T>
    AstrContainer<T>::~AstrContainer()
    {
    }

    typename
    v_p_elements::iterator AstrContainer<T>::begin() // - - - ERROR LINE 1 - - -
    {
        return _vData.begin();
    }

    template<class T>
    typename v_p_elements::iterator AstrContainer<T>::end() // - - - ERROR LINE 2 - - -
    {
        return _vData.end();
    }
}

我对 C++ 中的模板类非常陌生,有点卡在 ERROR LINE 1

错误 C2653:“v_p_elements”:不是类或命名空间名称

所以我评论了 begin() 方法,但在 ERROR LINE 2 它停止并出现相同的错误。

现在似乎很清楚,因为v_p_elements 是在类内部进行类型定义的,所以它可能无法导出到外部世界。但现在我要问的是整个事情是否可能,或者我只是误解了什么。

【问题讨论】:

标签: c++ templates typedef template-classes


【解决方案1】:

您可以添加限定的封闭类名称。

template<class T>
typename AstrContainer<T>::v_p_elements::iterator AstrContainer<T>::end()
//       ~~~~~~~~~~~~~~~~~~
{
    return _vData.end();
}

【讨论】:

  • 很好,但是如果我继承class CompositeCube : public AstrContainer&lt;Cube&gt;,我会进入第三类,调用CompositeCube cc; cc.begin();,如下:LNK2019 unresolved external symbol
  • @PatrizioBertoni 您是否将类模板的声明和实现分为头文件和实现文件(就像您展示的那样)?请参阅 Bo Persson 的评论。
  • 谢谢,MaHuJa 的回答顺利解决了一切!
【解决方案2】:

另一种方法是使用尾随返回类型:

template<class T>
auto AstrContainer<T>::end() -> typename v_p_elements::iterator
{
    return _vData.end();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2012-06-19
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多